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 +20/−17
- examples/fib.hs +3/−3
- memo-sqlite.cabal +18/−5
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