packages feed

gambler-0.0.0.0: source/Fold/Effectful/Examples.hs

-- | Some interesting examples of effectful folds
module Fold.Effectful.Examples where

import Fold.Effectful.Type

import Control.Monad (Monad)
import Data.Functor (void)
import Data.Monoid (Monoid, mempty)
import Data.Semigroup ((<>))
import Prelude (($!))

import qualified Control.Applicative as Applicative

{-| Performs an action for each input, discarding the result -}
effect :: Monad m => (a -> m b) -> EffectfulFold m a ()
effect f = effectMonoid (\a -> void (f a))

{-| Performs an action for each input, monoidally combining the results
from all the actions. -}
effectMonoid ::  (Monoid w, Monad m) => (a -> m w) -> EffectfulFold m a w
effectMonoid act = EffectfulFold
    { initial = Applicative.pure mempty
    , step = \m a -> do{ m' <- act a; Applicative.pure $! (<>) m m' }
    , extract = Applicative.pure
    }