packages feed

heart-core 0.2.0 → 0.3.0

raw patch · 3 files changed

+56/−13 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Heart.Core.RIO: withRIO :: (env -> env') -> RIO env' a -> RIO env a
+ Heart.Core.RIO: data SomeRef a
+ Heart.Core.RIO: getStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => m st
+ Heart.Core.RIO: liftRIO :: (MonadIO m, MonadReader env m) => RIO env a -> m a
+ Heart.Core.RIO: mapRIO :: (env -> env') -> RIO env' a -> RIO env a
+ Heart.Core.RIO: modifySomeRef :: MonadIO m => SomeRef a -> (a -> a) -> m ()
+ Heart.Core.RIO: modifyStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => (st -> st) -> m ()
+ Heart.Core.RIO: newSomeRef :: MonadIO m => a -> m (SomeRef a)
+ Heart.Core.RIO: putStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => st -> m ()
+ Heart.Core.RIO: readSomeRef :: MonadIO m => SomeRef a -> m a
+ Heart.Core.RIO: writeSomeRef :: MonadIO m => SomeRef a -> a -> m ()
- Heart.Core.RIO: stateRefL :: HasStateRef st env => Lens' env (IORef st)
+ Heart.Core.RIO: stateRefL :: HasStateRef st env => Lens' env (SomeRef st)

Files

README.md view
@@ -3,3 +3,5 @@ [![CircleCI](https://circleci.com/gh/ejconlon/heart-core/tree/master.svg?style=svg)](https://circleci.com/gh/ejconlon/heart-core/tree/master)  An opinionated library prelude in the UnliftIO style.++`Heart.Core.RIO` contains several definitions from the `RIO` library for compatibility ([LICENSE](https://hackage.haskell.org/package/rio-0.1.14.0/src/LICENSE)).
heart-core.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: effa1e2d3414d60241a02d0d77c5989b8a5a55d81b56c5ac194f1b2da2e79572+-- hash: a5cf742adaa5509eb6eec3356fe1c7597afd091efe599b3c5664ecbdd922a276  name:           heart-core-version:        0.2.0+version:        0.3.0 synopsis:       An opinionated library prelude in the UnliftIO style description:    Please see the README on GitHub at <https://github.com/ejconlon/heart-core#readme> category:       Prelude
src/Heart/Core/RIO.hs view
@@ -2,17 +2,30 @@ {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE UndecidableInstances #-} +{- |+Most definitions follow the RIO lib: https://hackage.haskell.org/package/rio-0.1.14.0/docs/RIO.html+See LICENSE info in the README.+-} module Heart.Core.RIO   ( HasStateRef (..)+  , SomeRef   , RIO (..)-  , withRIO+  , getStateRef+  , liftRIO+  , newSomeRef+  , mapRIO+  , modifySomeRef+  , modifyStateRef+  , putStateRef   , runRIO+  , readSomeRef+  , writeSomeRef   ) where  import Control.Monad.IO.Unlift (withUnliftIO) import Control.Monad.Reader (ReaderT (..)) import Heart.Core.Prelude-import UnliftIO.IORef (IORef, readIORef, writeIORef)+import UnliftIO.IORef (IORef, newIORef, readIORef, writeIORef)  newtype RIO env a = RIO { unRIO :: ReaderT env IO a }   deriving (Functor, Applicative, Monad, MonadReader env, MonadIO, MonadThrow, MonadFail, MonadCatch, MonadMask)@@ -20,8 +33,8 @@ instance MonadUnliftIO (RIO env) where   askUnliftIO = RIO (ReaderT (\r -> withUnliftIO (\u -> return (UnliftIO (unliftIO u . flip runReaderT r . unRIO))))) -withRIO :: (env -> env') -> RIO env' a -> RIO env a-withRIO f m = do+mapRIO :: (env -> env') -> RIO env' a -> RIO env a+mapRIO f m = do   env <- ask   let env' = f env   runRIO env' m@@ -34,13 +47,41 @@ runRIO :: MonadIO m => env -> RIO env a -> m a runRIO r m = liftIO (runReaderT (unRIO m) r) +data SomeRef a = SomeRef !(IO a) !(a -> IO ())++readSomeRef :: MonadIO m => SomeRef a -> m a+readSomeRef (SomeRef x _) = liftIO x++writeSomeRef :: MonadIO m => SomeRef a -> a -> m ()+writeSomeRef (SomeRef _ x) = liftIO . x++modifySomeRef :: MonadIO m => SomeRef a -> (a -> a) -> m ()+modifySomeRef (SomeRef read' write) f = liftIO (fmap f read' >>= write)++ioRefToSomeRef :: IORef a -> SomeRef a+ioRefToSomeRef ref = SomeRef (readIORef ref) (writeIORef ref)++newSomeRef :: MonadIO m => a -> m (SomeRef a)+newSomeRef = fmap ioRefToSomeRef . newIORef+ class HasStateRef st env | env -> st where-  stateRefL :: Lens' env (IORef st)+  stateRefL :: Lens' env (SomeRef st) +getStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => m st+getStateRef = do+  ref <- view stateRefL+  liftIO (readSomeRef ref)++putStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => st -> m ()+putStateRef st = do+  ref <- view stateRefL+  liftIO (writeSomeRef ref st)++modifyStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => (st -> st) -> m ()+modifyStateRef f = do+  ref <- view stateRefL+  liftIO (modifySomeRef ref f)+ instance HasStateRef st env => MonadState st (RIO env) where-  get = do-    ref <- view stateRefL-    readIORef ref-  put st = do-    ref <- view stateRefL-    writeIORef ref st+  get = getStateRef+  put = putStateRef