module DeferredFolds.Defs.UnfoldrM where

import DeferredFolds.Prelude
import DeferredFolds.Types

unfoldr :: (Monad m) => Unfoldr a -> UnfoldrM m a
unfoldr :: forall (m :: * -> *) a. Monad m => Unfoldr a -> UnfoldrM m a
unfoldr (Unfoldr forall x. (a -> x -> x) -> x -> x
unfoldr) = (forall x. (a -> x -> m x) -> x -> m x) -> UnfoldrM m a
forall (m :: * -> *) a.
(forall x. (a -> x -> m x) -> x -> m x) -> UnfoldrM m a
UnfoldrM ((forall x. (a -> x -> m x) -> x -> m x) -> UnfoldrM m a)
-> (forall x. (a -> x -> m x) -> x -> m x) -> UnfoldrM m a
forall a b. (a -> b) -> a -> b
$ \a -> x -> m x
stepM ->
  let step :: a -> (x -> m x) -> x -> m x
step a
input x -> m x
act x
state = a -> x -> m x
stepM a
input x
state m x -> (x -> m x) -> m x
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= x -> m x
act
   in (a -> (x -> m x) -> x -> m x) -> (x -> m x) -> x -> m x
forall x. (a -> x -> x) -> x -> x
unfoldr a -> (x -> m x) -> x -> m x
step x -> m x
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return