{- |
   Module     : Development.Shake.Plus.Cache
   License    : MIT
   Stability  : experimental

Cache utilities in "Development.Shake" lifted to `MonadAction`.
-}
module Development.Shake.Plus.Cache (
  newCache
, newCacheIO
) where

import qualified Development.Shake
import           Development.Shake.Plus.Core
import           RIO

-- | Lifted version of `Development.Shake.newCache` using `RAction`.
newCache :: (MonadRules m, MonadReader r m, Eq k, Hashable k)
         => (k -> RAction r v)
         -> m (k -> RAction r v)
newCache :: (k -> RAction r v) -> m (k -> RAction r v)
newCache k -> RAction r v
ract = m r
forall r (m :: * -> *). MonadReader r m => m r
ask m r -> (r -> m (k -> RAction r v)) -> m (k -> RAction r v)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \r
r -> Rules (k -> RAction r v) -> m (k -> RAction r v)
forall (m :: * -> *) a. MonadRules m => Rules a -> m a
liftRules (Rules (k -> RAction r v) -> m (k -> RAction r v))
-> Rules (k -> RAction r v) -> m (k -> RAction r v)
forall a b. (a -> b) -> a -> b
$ (Action v -> RAction r v
forall (m :: * -> *) a. MonadAction m => Action a -> m a
liftAction (Action v -> RAction r v) -> (k -> Action v) -> k -> RAction r v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ) ((k -> Action v) -> k -> RAction r v)
-> Rules (k -> Action v) -> Rules (k -> RAction r v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (k -> Action v) -> Rules (k -> Action v)
forall k v.
(Eq k, Hashable k) =>
(k -> Action v) -> Rules (k -> Action v)
Development.Shake.newCache (r -> RAction r v -> Action v
forall (m :: * -> *) env a.
MonadAction m =>
env -> RAction env a -> m a
runRAction r
r (RAction r v -> Action v) -> (k -> RAction r v) -> k -> Action v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> RAction r v
ract)

-- | Lifted version of `Development.Shake.newCacheIO` using `RAction`.
newCacheIO :: (MonadIO m, MonadReader r m, Eq k, Hashable k) => (k -> RAction r v) -> m (k -> RAction r v)
newCacheIO :: (k -> RAction r v) -> m (k -> RAction r v)
newCacheIO k -> RAction r v
f = m r
forall r (m :: * -> *). MonadReader r m => m r
ask m r -> (r -> m (k -> RAction r v)) -> m (k -> RAction r v)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \r
r -> IO (k -> RAction r v) -> m (k -> RAction r v)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (k -> RAction r v) -> m (k -> RAction r v))
-> IO (k -> RAction r v) -> m (k -> RAction r v)
forall a b. (a -> b) -> a -> b
$ (Action v -> RAction r v
forall (m :: * -> *) a. MonadAction m => Action a -> m a
liftAction (Action v -> RAction r v) -> (k -> Action v) -> k -> RAction r v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ) ((k -> Action v) -> k -> RAction r v)
-> IO (k -> Action v) -> IO (k -> RAction r v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (k -> Action v) -> IO (k -> Action v)
forall k v.
(Eq k, Hashable k) =>
(k -> Action v) -> IO (k -> Action v)
Development.Shake.newCacheIO (\k
y -> r -> RAction r v -> Action v
forall (m :: * -> *) env a.
MonadAction m =>
env -> RAction env a -> m a
runRAction r
r (k -> RAction r v
f k
y))