packages feed

memo-sqlite 0.1 → 0.2

raw patch · 3 files changed

+41/−25 lines, 3 filesdep +textdep ~direct-sqlite

Dependencies added: text

Dependency ranges changed: direct-sqlite

Files

Data/Memo/Sqlite.hs view
@@ -3,7 +3,7 @@ Copyright   :  (c) 2011 Claude Heiland-Allen License     :  BSD3 -Maintainer  :  claudiusmaximus@goto10.org+Maintainer  :  claude@mathr.co.uk Stability   :  unstable Portability :  portable @@ -51,6 +51,9 @@   * the @data-memocombinators@ package for pure in-memory memoization.  -}++{-# LANGUAGE OverloadedStrings #-}+ module Data.Memo.Sqlite   (   -- * Database table identifier.@@ -80,24 +83,24 @@   , SQLData(..)   ) where -import Prelude hiding (lookup)+import Prelude hiding (lookup, all) -import Control.Monad.Instances () -- Functor ((,) a)-import Data.List (isPrefixOf) import System.IO (fixIO) +import Data.Text as T+ import Database.SQLite3 -- hackage: direct-sqlite  -- | A valid SQLite3 table name.-newtype Table = Table String deriving (Eq, Ord, Show)+newtype Table = Table Text deriving (Eq, Ord, Show)  -- | Construct a table name.-table :: String -> Maybe Table-table [] = Nothing-table s@(c:_)-  | c `elem` letters &&+table :: Text -> Maybe Table+table s+  | T.null s = Nothing+  | T.head s `elem` letters &&     all (`elem` alphaNum) s &&-    not ("sqlite_" `isPrefixOf` s) = Just (Table $ "\"" ++ s ++ "\"")+    not ("sqlite_" `isPrefixOf` s) = Just (Table $ "\"" <> s <> "\"")   | otherwise = Nothing   where     letters  = ['a'..'z'] ++ ['A'..'Z']@@ -119,8 +122,8 @@ newtype ReadShow t = ReadShow{ unReadShow :: t }  instance (Read t, Show t) => Sqlite (ReadShow t) where-  toSqlite   (ReadShow t) = SQLText (show t)-  fromSqlite (SQLText  s) = ReadShow $ read s+  toSqlite   (ReadShow t) = SQLText (T.pack $ show t)+  fromSqlite (SQLText  s) = ReadShow $ read (T.unpack s)  toReadShow :: Wrap ReadShow ReadShow k v toReadShow f k = ReadShow `fmap` f (unReadShow k)@@ -134,20 +137,20 @@  type Memo k v = (k -> IO v) -> IO (IO (), k -> IO v) type MemoRec k v = ((k -> IO v) -> k -> IO v) -> IO (IO (), k -> IO v)-type MkMemo k v = FilePath -> Table -> Memo k v-type MkMemoRec k v = FilePath -> Table -> MemoRec k v+type MkMemo k v = Text -> Table -> Memo k v+type MkMemoRec k v = Text -> Table -> MemoRec k v  -- | Memoize a function using an SQLite3 database. memo :: (Sqlite k, Sqlite v) => MkMemo k v memo file (Table tab) f = do   db <- open file   -- create database-  create <- prepare db $ "CREATE TABLE IF NOT EXISTS " ++ tab ++ " ( k TEXT PRIMARY KEY, v TEXT )"+  create <- prepare db $ "CREATE TABLE IF NOT EXISTS " <> tab <> " ( k TEXT PRIMARY KEY, v TEXT )"   _ <- step create   finalize create   -- prepare statements-  lookup <- prepare db $ "SELECT v FROM " ++ tab ++ " WHERE k = ? LIMIT 1"-  insert <- prepare db $ "INSERT INTO " ++ tab ++ " ( k , v ) VALUES ( ? , ? )"+  lookup <- prepare db $ "SELECT v FROM " <> tab <> " WHERE k = ? LIMIT 1"+  insert <- prepare db $ "INSERT INTO " <> tab <> " ( k , v ) VALUES ( ? , ? )"   let -- clean up database       cleanup = do         finalize lookup
examples/fib.hs view
@@ -1,6 +1,6 @@ import Control.Monad (liftM2) import System.Environment (getArgs)-+import qualified Data.Text as T import Data.Memo.Sqlite (memoRec', readShow, table)  -- | Compute Fibonacci numbers.@@ -13,9 +13,9 @@ main :: IO () main = do   [file, ts, ns] <- getArgs-  let Just t = table ts+  let Just t = table (T.pack ts)       n = read ns-  (cleanup, fib') <- memoRec' readShow file t fib+  (cleanup, fib') <- memoRec' readShow (T.pack file) t fib   fib' n >>= \fn -> putStrLn $ "fib(" ++ show n ++ ") = " ++ show fn   cleanup 
memo-sqlite.cabal view
@@ -1,16 +1,29 @@ Name:                memo-sqlite-Version:             0.1+Version:             0.2 Synopsis:            memoize functions using SQLite3 database-Homepage:            https://gitorious.org/memo-sqlite+Homepage:            https://code.mathr.co.uk/memo-sqlite License:             BSD3 License-file:        LICENSE Author:              Claude Heiland-Allen-Maintainer:          claudiusmaximus@goto10.org+Maintainer:          claude@mathr.co.uk Category:            Database Build-type:          Simple Extra-source-files:  examples/fib.hs-Cabal-version:       >=1.2+Cabal-version:       >=1.10  Library   Exposed-modules:     Data.Memo.Sqlite-  Build-depends:       base < 5, direct-sqlite >= 1 && < 2+  Build-depends:       base < 5,+                       direct-sqlite >= 2.3 && < 2.4,+                       text >= 1.2 && < 1.3+  default-language:    Haskell2010+  other-extensions:    OverloadedStrings++source-repository head+  type: git+  location: https://code.mathr.co.uk/memo-sqlite.git++source-repository this+  type: git+  location: https://code.mathr.co.uk/memo-sqlite.git+  tag: memo-sqlite-0.2