little-rio 0.2.0 → 0.2.1
raw patch · 2 files changed
+53/−5 lines, 2 files
Files
- little-rio.cabal +2/−2
- src/LittleRIO.hs +51/−3
little-rio.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: d22342ec62f05927c43b7ecfdacef567fa519fafdf63e0545b49683ac1a14856+-- hash: c4d3676360878246e0cc19b1cd117171bed224a6f806b03e54e033317210f478 name: little-rio-version: 0.2.0+version: 0.2.1 synopsis: When you need just the RIO monad description: Please see the README on GitHub at <https://github.com/ejconlon/little-rio#readme> category: Control
src/LittleRIO.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -13,6 +14,9 @@ ( HasResourceMap (..) , HasStateRef (..) , HasWriteRef (..)+ , SimpleResourceEnv (..)+ , SimpleStateEnv (..)+ , SimpleWriteEnv (..) , SomeRef (..) , ResourceMap , RIO (..)@@ -25,6 +29,9 @@ , modifyStateRef , passWriteRef , putStateRef+ , runSimpleResourceRIO+ , runSimpleStateRIO+ , runSimpleWriteRIO , runRIO , readSomeRef , resourceRIO@@ -45,7 +52,7 @@ import Control.Monad.Trans.Resource.Internal (MonadResource (..), ReleaseMap, ResourceT (..)) import Control.Monad.Writer (MonadWriter (..)) import Data.IORef (IORef, newIORef, readIORef, writeIORef)-import Lens.Micro (Lens')+import Lens.Micro (Lens', lens) import Lens.Micro.Mtl (view) import Prelude @@ -70,9 +77,9 @@ runRIO env' m liftRIO :: (MonadIO m, MonadReader env m) => RIO env a -> m a-liftRIO rio = do+liftRIO m = do env <- ask- runRIO env rio+ runRIO env m unliftRIO :: MonadIO m => env -> m (UnliftIO (RIO env)) unliftRIO env = liftIO (runRIO env askUnliftIO)@@ -103,6 +110,21 @@ instance HasStateRef a (SomeRef a) where stateRefL = id +data SimpleStateEnv st env = SimpleStateEnv+ { sseRef :: !(SomeRef st)+ , sseEnv :: !env+ } deriving (Functor, Foldable, Traversable)++instance HasStateRef st (SimpleStateEnv st env) where+ stateRefL = lens sseRef (\(SimpleStateEnv _ env) st -> SimpleStateEnv st env)++runSimpleStateRIO :: MonadIO m => st -> env -> RIO (SimpleStateEnv st env) a -> m (a, st)+runSimpleStateRIO st env m = do+ ref <- newSomeRef st+ a <- runRIO (SimpleStateEnv ref env) m+ st' <- readSomeRef ref+ pure (a, st')+ getStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => m st getStateRef = do ref <- view stateRefL@@ -128,6 +150,21 @@ instance HasWriteRef a (SomeRef a) where writeRefL = id +data SimpleWriteEnv w env = SimpleWriteEnv+ { sweRef :: !(SomeRef w)+ , sweEnv :: !env+ } deriving (Functor, Foldable, Traversable)++instance HasWriteRef w (SimpleWriteEnv w env) where+ writeRefL = lens sweRef (\(SimpleWriteEnv _ env) w -> SimpleWriteEnv w env)++runSimpleWriteRIO :: (MonadIO m, Monoid w) => env -> RIO (SimpleWriteEnv w env) a -> m (a, w)+runSimpleWriteRIO env m = do+ ref <- newSomeRef mempty+ a <- runRIO (SimpleWriteEnv ref env) m+ w <- readSomeRef ref+ pure (a, w)+ tellWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m, Semigroup w) => w -> m () tellWriteRef value = do ref <- view writeRefL@@ -167,6 +204,17 @@ instance HasResourceMap (IORef ReleaseMap) where resourceMapL = id++data SimpleResourceEnv env = SimpleResourceEnv+ { sreMap :: !ResourceMap+ , sreEnv :: !env+ } deriving (Functor, Foldable, Traversable)++instance HasResourceMap (SimpleResourceEnv env) where+ resourceMapL = lens sreMap (\(SimpleResourceEnv _ env) m -> SimpleResourceEnv m env)++runSimpleResourceRIO :: MonadUnliftIO m => env -> RIO (SimpleResourceEnv env) a -> m a+runSimpleResourceRIO env m = withResourceMap (\rm -> runRIO (SimpleResourceEnv rm env) m) resourceRIO :: HasResourceMap env => ResourceT IO a -> RIO env a resourceRIO (ResourceT f) = view resourceMapL >>= liftIO . f