module Data.Fold.Class
( Folding(..)
, beneath
) where
import Control.Lens
import Control.Lens.Internal.Setter
import Data.Foldable
import Data.Profunctor.Unsafe
newtype One a = One a
instance Foldable One where
foldMap f (One a) = f a
class Choice p => Folding p where
prefix :: Foldable t => t a -> p a b -> p a b
prefix = prefixOf folded
prefix1 :: a -> p a b -> p a b
prefix1 = prefix . One
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
postfix1 :: p a b -> a -> p a b
postfix1 p = postfix p . One
postfixOf :: Fold s a -> p a b -> s -> p a b
run :: Foldable t => t a -> p a b -> b
run = runOf folded
run1 :: a -> p a b -> b
run1 = run . One
runOf :: Fold s a -> s -> p a b -> b
beneath :: Profunctor p => Overloaded p Mutator s t a b -> p a b -> p s t
beneath l f = runMutator #. l (Mutator #. f)