module Model.Query ( Query(..) , run ) where import Data.Functor (Functor) import Database.SQLite.Simple (Connection) import qualified Database.SQLite.Simple as SQLite data Query a = Query (Connection -> IO a) instance Functor Query where fmap f (Query call) = Query (fmap f . call) instance Applicative Query where pure x = Query (const $ return x) (Query callF) <*> (Query callX) = Query (\conn -> do x <- callX conn f <- callF conn return (f x)) instance Monad Query where (Query callX) >>= f = Query (\conn -> do x <- callX conn case f x of Query callY -> callY conn) run :: Query a -> IO a run (Query call) = do conn <- SQLite.open "database" result <- call conn _ <- SQLite.close conn return result