Skip to content

Instantly share code, notes, and snippets.

@qnikst
Created July 11, 2014 13:42
Show Gist options
  • Save qnikst/bf33ce813d7d52a1524e to your computer and use it in GitHub Desktop.
Save qnikst/bf33ce813d7d52a1524e to your computer and use it in GitHub Desktop.
import Control.Monad.State (StateT)
import qualified Control.Monad.State as State
import Data.Map (Map)
import qualified Data.Map as Map
import Data.IORef (IORef)
import qualified Data.IORef as IORef
data AbstractKVS m k v = AbstractKVS
{ kvsPut :: k -> v -> m ()
, kvsGet :: k -> m (Maybe v)
, kvsModify :: (Maybe v -> Maybe v) -> k -> m ()
}
stateTKVS :: (Ord k, Monad m) => AbstractKVS (StateT (Map k v) m) k v
stateTKVS = AbstractKVS
{ kvsPut = \k v -> State.modify (Map.insert k v)
, kvsGet = \k -> State.gets (Map.lookup k)
, kvsModify = \f k -> State.modify (Map.alter f k)
}
iorefMapKVS :: (Ord k) => IORef (Map k v) -> AbstractKVS IO k v
iorefMapKVS s = AbstractKVS
{ kvsPut = \k v -> IORef.modifyIORef' s (Map.insert k v)
, kvsGet = \k -> fmap (Map.lookup k) (IORef.readIORef s)
, kvsModify = \f k -> IORef.modifyIORef' s (Map.alter f k)
}
test0 :: Monad m => AbstractKVS m String Int -> m Int
test0 (AbstractKVS put get modify) = do
x <- get "7"
put "8" 5
Just i <- get "8"
return i
runtests :: IO ()
runtests = do
print =<< State.evalStateT (test0 stateTKVS) Map.empty
print =<< test0 . iorefMapKVS =<< IORef.newIORef Map.empty
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment