gambler-0.0.0.0: source/Fold/Effectful/Conversion.hs
-- | Getting an 'EffectfulFold' from some other type of fold
module Fold.Effectful.Conversion where
import Fold.Effectful.Type
import Control.Monad (Monad)
import Data.Maybe (Maybe)
import Fold.Nonempty.Type (NonemptyFold)
import qualified Control.Applicative as Applicative
import qualified Fold.Pure.Conversion as Pure
import qualified Fold.Pure.Type as Pure
{-| Generalize a pure fold to an effectful fold -}
fold :: Monad m => Pure.Fold a b -> EffectfulFold m a b
fold Pure.Fold{ Pure.initial, Pure.step, Pure.extract } = EffectfulFold
{ initial = Applicative.pure ( initial )
, step = \x a -> Applicative.pure ( step x a )
, extract = \x -> Applicative.pure ( extract x )
}
{-| Turn a nonempty fold that requires at least one input into a fold that
returns 'Data.Maybe.Nothing' when there are no inputs -}
nonemptyFold :: Monad m => NonemptyFold a b -> EffectfulFold m a (Maybe b)
nonemptyFold x = fold (Pure.nonemptyFold x)