packages feed

CurryDB-0.1.1.0: Database/Curry/Commands.hs

{-# LANGUAGE BangPatterns #-}

module Database.Curry.Commands (
  -- Commands
  insert,
  insertWith,
  delete,
  lookup,
  lookupDefault,
  keys,

  -- Transaction
  transaction,
  ) where

import           Control.Applicative
import           Control.Concurrent.STM
import           Control.Lens
import           Control.Monad.State.Strict
import           Control.Monad.Trans.Identity
import qualified Data.ByteString              as S
import           Data.Conduit
import           Data.Default
import           Data.Maybe

import qualified Database.Curry.HashMap       as HM
import           Database.Curry.Types

import           Prelude                      hiding (lookup)

insert :: S.ByteString -> v -> DBMS v ()
insert !key !val = do
  liftSTM . HM.insert key val =<< use dbmTable
  update
{-# INLINE insert #-}

insertWith :: (v -> v -> v) -> S.ByteString -> v -> DBMS v ()
insertWith !f !key !val = do
  liftSTM . HM.insertWith f key val =<< use dbmTable
  update
{-# INLINE insertWith #-}

delete :: S.ByteString -> DBMS v ()
delete !key = do
  liftSTM . HM.delete key =<< use dbmTable
  update
{-# INLINE delete #-}

lookup :: S.ByteString -> DBMS v (Maybe v)
lookup !key = do
  ht <- use dbmTable
  liftSTM $ HM.lookup key ht
{-# INLINE lookup #-}

lookupDefault :: Default v => S.ByteString -> DBMS v v
lookupDefault !key = fromMaybe def <$> lookup key
{-# INLINE lookupDefault #-}

keys :: Monad m => DBMS v (Source (DBMT v m) S.ByteString)
keys = do
  ht <- use dbmTable
  ks <- liftSTM $ HM.keys ht
  return $ mapM_ yield ks
{-# INLINE keys #-}

update ::DBMS v ()
update = liftSTM =<< use dbmUpdate
{-# INLINE update #-}

transaction :: MonadIO m => DBMS v a -> DBMT v m a
transaction =
  lift . mapStateT (liftIO . atomically) . runIdentityT . unDBMT
{-# INLINE transaction #-}