module Data.Fold.Class
( Scan(..)
, Folding(..)
, beneath
) where
import Control.Lens
#if __GLASGOW_HASKELL__ < 710
import Data.Foldable
#endif
import Data.Fold.Internal
import Data.Profunctor.Unsafe
class Choice p => Scan p where
prefix1 :: a -> p a b -> p a b
#ifndef HLINT
default prefix1 :: Folding p => a -> p a b -> p a b
#endif
prefix1 = prefix . An
postfix1 :: p a b -> a -> p a b
#ifndef HLINT
default postfix1 :: Folding p => p a b -> a -> p a b
#endif
postfix1 p = postfix p . An
run1 :: a -> p a b -> b
#ifndef HLINT
default run1 :: Folding p => a -> p a b -> b
#endif
run1 = run . An
interspersing :: a -> p a b -> p a b
class Scan p => Folding p where
prefix :: Foldable t => t a -> p a b -> p a b
prefix = prefixOf folded
prefixOf :: Fold s a -> s -> p a b -> p a b
postfix :: Foldable t => p a b -> t a -> p a b
postfix = postfixOf folded
postfixOf :: Fold s a -> p a b -> s -> p a b
run :: Foldable t => t a -> p a b -> b
run = runOf folded
runOf :: Fold s a -> s -> p a b -> b
filtering :: (a -> Bool) -> p a b -> p a b
beneath :: Profunctor p => Optic p Identity s t a b -> p a b -> p s t
beneath l f = runIdentity #. l (Identity #. f)