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

Forward mode utilities in "Development.Shake.Forward" lifted to `MonadAction` and `MonadRules`.
-}
module Development.Shake.Plus.Forward (
  shakeForward
, shakeArgsForward
, Development.Shake.Forward.forwardOptions
, forwardRule
, cache
, cacheAction
, cacheActionWith
) where

import           Development.Shake.Classes
import qualified Development.Shake.Forward
import           Development.Shake.Plus.Command
import           Development.Shake.Plus.Core
import           RIO

-- | Lifted version of `Development.Shake.Forward.shakeForward` using `RAction`.
shakeForward :: MonadIO m => ShakeOptions -> r -> RAction r () -> m ()
shakeForward :: ShakeOptions -> r -> RAction r () -> m ()
shakeForward ShakeOptions
opts r
env RAction r ()
ract = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Action () -> IO ()
Development.Shake.Forward.shakeForward ShakeOptions
opts (r -> RAction r () -> Action ()
forall (m :: * -> *) env a.
MonadAction m =>
env -> RAction env a -> m a
runRAction r
env RAction r ()
ract)

-- | Lifted version of `Development.Shake.Forward.shakeArgsForward` using `RAction`.
shakeArgsForward :: MonadIO m => ShakeOptions -> r -> RAction r () -> m ()
shakeArgsForward :: ShakeOptions -> r -> RAction r () -> m ()
shakeArgsForward ShakeOptions
opts r
env RAction r ()
ract = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Action () -> IO ()
Development.Shake.Forward.shakeArgsForward ShakeOptions
opts (r -> RAction r () -> Action ()
forall (m :: * -> *) env a.
MonadAction m =>
env -> RAction env a -> m a
runRAction r
env RAction r ()
ract)

-- | Lifted version of `Development.Shake.forwardRule` using `RAction`.
forwardRule :: (MonadReader r m, MonadRules m) => RAction r () -> m ()
forwardRule :: RAction r () -> m ()
forwardRule RAction r ()
ract = m r
forall r (m :: * -> *). MonadReader r m => m r
ask m r -> (r -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \r
r -> Rules () -> m ()
forall (m :: * -> *) a. MonadRules m => Rules a -> m a
liftRules (Rules () -> m ()) -> Rules () -> m ()
forall a b. (a -> b) -> a -> b
$ Action () -> Rules ()
Development.Shake.Forward.forwardRule (r -> RAction r () -> Action ()
forall (m :: * -> *) env a.
MonadAction m =>
env -> RAction env a -> m a
runRAction r
r RAction r ()
ract)

-- | Lifted version of `Development.Shake.cache`.
cache :: MonadAction m => (forall r. CmdArguments r => r) -> m ()
cache :: (forall r. CmdArguments r => r) -> m ()
cache = \forall r. CmdArguments r => r
c -> Action () -> m ()
forall (m :: * -> *) a. MonadAction m => Action a -> m a
liftAction Action ()
forall r. CmdArguments r => r
c

-- | Lifted version of `Development.Shake.Forward.cacheAction`.
cacheAction :: (MonadUnliftAction m, Typeable a, Binary a, Show a, Typeable b, Binary b, Show b) => a -> m b -> m b
cacheAction :: a -> m b -> m b
cacheAction a
x m b
a = ((forall a. m a -> Action a) -> Action b) -> m b
forall (m :: * -> *) b.
MonadUnliftAction m =>
((forall a. m a -> Action a) -> Action b) -> m b
withRunInAction (((forall a. m a -> Action a) -> Action b) -> m b)
-> ((forall a. m a -> Action a) -> Action b) -> m b
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> Action a
run -> a -> Action b -> Action b
forall a b.
(Typeable a, Binary a, Show a, Typeable b, Binary b, Show b) =>
a -> Action b -> Action b
Development.Shake.Forward.cacheAction a
x (m b -> Action b
forall a. m a -> Action a
run m b
a)

-- | Lifted version of `Development.Shake.Forward.cacheActionWith`.
cacheActionWith :: (MonadUnliftAction m, Typeable a, Binary a, Show a, Typeable b, Binary b, Show b, Typeable c, Binary c, Show c) => a -> b -> m c -> m c
cacheActionWith :: a -> b -> m c -> m c
cacheActionWith a
a b
b m c
m = ((forall a. m a -> Action a) -> Action c) -> m c
forall (m :: * -> *) b.
MonadUnliftAction m =>
((forall a. m a -> Action a) -> Action b) -> m b
withRunInAction (((forall a. m a -> Action a) -> Action c) -> m c)
-> ((forall a. m a -> Action a) -> Action c) -> m c
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> Action a
run -> a -> b -> Action c -> Action c
forall a b c.
(Typeable a, Binary a, Show a, Typeable b, Binary b, Show b,
 Typeable c, Binary c, Show c) =>
a -> b -> Action c -> Action c
Development.Shake.Forward.cacheActionWith a
a b
b (m c -> Action c
forall a. m a -> Action a
run m c
m)