packages feed

lhc-0.6.20081127: src/Support/Tickle.hs

module Support.Tickle where

import Control.Monad.Identity
import Control.Monad.Writer


class Tickleable a b where
    tickleM :: Monad m => (a -> m a) -> b -> m b
    tickleM_ :: Monad m => (a -> m c) -> b -> m ()
    tickle :: (a -> a) -> b -> b

    tickle f x = runIdentity $ tickleM (return . f) x
    tickleM_ f b = tickleM (\x -> f x >> return x) b >> return ()

tickleCollect :: (Tickleable a b, Monoid o) => (a -> o) -> b -> o
tickleCollect f b = execWriter (tickleM_ (tell . f) b)