cache-polysemy 0.1.1 → 0.1.2
raw patch · 2 files changed
+61/−2 lines, 2 files
Files
- cache-polysemy.cabal +2/−2
- src/Polysemy/Cache.hs +59/−0
cache-polysemy.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: bbfeaacd25354057ddf0c42d9376394235b2c38637b3e5290009ef4d025cf777+-- hash: bab52d012830e3889f818b644fb55b9a8d1dfa6fe05fd38449972264a4814ba7 name: cache-polysemy-version: 0.1.1+version: 0.1.2 synopsis: cached hashmaps description: An polysemy interface for cached hashmaps and an interpreter implemented using <https://hackage.haskell.org/package/cache cache> category: Cache
src/Polysemy/Cache.hs view
@@ -118,6 +118,50 @@ cache <- atomicGet atomicPut $ C.setDefaultExpiration cache ts +-- | Alternative version of 'runCacheAtomicState' that uses 'Final' instead of 'Embed'+runCacheAtomicState' ::+ forall k v r a.+ Members '[Final IO, AtomicState (C.Cache k v)] r =>+ Sem (Cache k v ': r) a ->+ Sem r a+runCacheAtomicState' = interpret $ \case+ Insert k v -> do+ cache <- atomicGet+ embedFinal $ C.insert cache k v+ Insert' ts k v -> do+ cache <- atomicGet+ embedFinal $ C.insert' cache ts k v+ Lookup k -> do+ cache <- atomicGet+ embedFinal $ C.lookup cache k+ Lookup' k -> do+ cache <- atomicGet+ embedFinal $ C.lookup cache k+ Keys -> do+ cache <- atomicGet+ embedFinal $ C.keys cache+ Delete k -> do+ cache <- atomicGet+ embedFinal $ C.delete cache k+ FilterWithKey pred -> do+ cache <- atomicGet+ embedFinal $ C.filterWithKey pred cache+ Purge -> do+ cache <- atomicGet+ embedFinal $ C.purge cache+ PurgeExpired -> do+ cache <- atomicGet+ embedFinal $ C.purgeExpired cache+ Size -> do+ cache <- atomicGet+ embedFinal $ C.size cache+ DefaultExipration -> do+ cache <- atomicGet+ pure $ C.defaultExpiration cache+ SetDefaultExpiration ts -> do+ cache <- atomicGet+ atomicPut $ C.setDefaultExpiration cache ts+ -- | Run a 'Cache', given a default expiration time. runCache :: forall k v r a.@@ -131,3 +175,18 @@ eff & runCacheAtomicState & runAtomicStateIORef ref++-- | Alternative version of 'runCache' that uses 'Final' instead of 'Embed'+runCache' ::+ forall k v r a.+ Members '[Final IO] r =>+ Maybe TimeSpec ->+ Sem (Cache k v ': AtomicState (C.Cache k v) ': Embed IO ': r) a ->+ Sem r a+runCache' ts eff = do+ cache <- embedFinal $ C.newCache ts+ ref <- embedFinal $ newIORef cache+ eff+ & runCacheAtomicState+ & runAtomicStateIORef ref+ & embedToFinal