{-# LANGUAGE BlockArguments #-}

module Control.Monad.Cont.MiscYj where

import Control.Monad
import Control.Monad.Cont

mapContM :: (a -> (b -> m c) -> m c) -> [a] -> ([b] -> m c) -> m c
mapContM :: forall a b (m :: * -> *) c.
(a -> (b -> m c) -> m c) -> [a] -> ([b] -> m c) -> m c
mapContM a -> (b -> m c) -> m c
f = ContT c m [b] -> ([b] -> m c) -> m c
forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT (ContT c m [b] -> ([b] -> m c) -> m c)
-> ([a] -> ContT c m [b]) -> [a] -> ([b] -> m c) -> m c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> ContT c m b) -> [a] -> ContT c m [b]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (((b -> m c) -> m c) -> ContT c m b
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((b -> m c) -> m c) -> ContT c m b)
-> (a -> (b -> m c) -> m c) -> a -> ContT c m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b -> m c) -> m c
f)

replicateContM :: Int -> ((a -> m b) -> m b) -> (([a] -> m b) -> m b)
replicateContM :: forall a (m :: * -> *) b.
Int -> ((a -> m b) -> m b) -> ([a] -> m b) -> m b
replicateContM Int
n = ContT b m [a] -> ([a] -> m b) -> m b
forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT (ContT b m [a] -> ([a] -> m b) -> m b)
-> (((a -> m b) -> m b) -> ContT b m [a])
-> ((a -> m b) -> m b)
-> ([a] -> m b)
-> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ContT b m a -> ContT b m [a]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n (ContT b m a -> ContT b m [a])
-> (((a -> m b) -> m b) -> ContT b m a)
-> ((a -> m b) -> m b)
-> ContT b m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> m b) -> m b) -> ContT b m a
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT