{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
module Control.MapReduce.Core
(
Unpack(..)
, Assign(..)
, Reduce(..)
, UnpackM(..)
, AssignM(..)
, ReduceM(..)
, generalizeUnpack
, generalizeAssign
, generalizeReduce
, functionToFold
, functionToFoldM
, postMapM
, Fold
, FoldM
, fold
, foldM
)
where
import qualified Control.Foldl as FL
import Control.Foldl ( Fold
, FoldM
, fold
, foldM
)
import qualified Data.Profunctor as P
import Data.Profunctor ( Profunctor )
import qualified Data.Sequence as S
import Control.Arrow ( second )
data Unpack x y where
Filter :: (x -> Bool) -> Unpack x x
Unpack :: Traversable g => (x -> g y) -> Unpack x y
boolToMaybe :: Bool -> a -> Maybe a
boolToMaybe :: forall a. Bool -> a -> Maybe a
boolToMaybe Bool
b a
x = if Bool
b then forall a. a -> Maybe a
Just a
x else forall a. Maybe a
Nothing
ifToMaybe :: (x -> Bool) -> x -> Maybe x
ifToMaybe :: forall x. (x -> Bool) -> x -> Maybe x
ifToMaybe x -> Bool
t x
x = forall a. Bool -> a -> Maybe a
boolToMaybe (x -> Bool
t x
x) x
x
instance Functor (Unpack x) where
fmap :: forall a b. (a -> b) -> Unpack x a -> Unpack x b
fmap a -> b
h (Filter x -> Bool
t) = forall (g :: * -> *) x y. Traversable g => (x -> g y) -> Unpack x y
Unpack (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. (x -> Bool) -> x -> Maybe x
ifToMaybe x -> Bool
t)
fmap a -> b
h (Unpack x -> g a
f) = forall (g :: * -> *) x y. Traversable g => (x -> g y) -> Unpack x y
Unpack (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> g a
f)
{-# INLINABLE fmap #-}
instance P.Profunctor Unpack where
dimap :: forall a b c d. (a -> b) -> (c -> d) -> Unpack b c -> Unpack a d
dimap a -> b
l c -> d
r (Filter b -> Bool
t) = forall (g :: * -> *) x y. Traversable g => (x -> g y) -> Unpack x y
Unpack ( forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. (x -> Bool) -> x -> Maybe x
ifToMaybe b -> Bool
t forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l)
dimap a -> b
l c -> d
r (Unpack b -> g c
f) = forall (g :: * -> *) x y. Traversable g => (x -> g y) -> Unpack x y
Unpack ( forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> g c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l)
{-# INLINABLE dimap #-}
data UnpackM m x y where
FilterM :: Monad m => (x -> m Bool) -> UnpackM m x x
UnpackM :: (Monad m, Traversable g) => (x -> m (g y)) -> UnpackM m x y
ifToMaybeM :: Monad m => (x -> m Bool) -> x -> m (Maybe x)
ifToMaybeM :: forall (m :: * -> *) x.
Monad m =>
(x -> m Bool) -> x -> m (Maybe x)
ifToMaybeM x -> m Bool
t x
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. Bool -> a -> Maybe a
`boolToMaybe` x
x) (x -> m Bool
t x
x)
instance Functor (UnpackM m x) where
fmap :: forall a b. (a -> b) -> UnpackM m x a -> UnpackM m x b
fmap a -> b
h (FilterM x -> m Bool
t) = forall (m :: * -> *) (g :: * -> *) x y.
(Monad m, Traversable g) =>
(x -> m (g y)) -> UnpackM m x y
UnpackM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) x.
Monad m =>
(x -> m Bool) -> x -> m (Maybe x)
ifToMaybeM x -> m Bool
t)
fmap a -> b
h (UnpackM x -> m (g a)
f) = forall (m :: * -> *) (g :: * -> *) x y.
(Monad m, Traversable g) =>
(x -> m (g y)) -> UnpackM m x y
UnpackM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h) forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> m (g a)
f)
{-# INLINABLE fmap #-}
instance Profunctor (UnpackM m) where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> UnpackM m b c -> UnpackM m a d
dimap a -> b
l c -> d
r (FilterM b -> m Bool
t) = forall (m :: * -> *) (g :: * -> *) x y.
(Monad m, Traversable g) =>
(x -> m (g y)) -> UnpackM m x y
UnpackM ( forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) x.
Monad m =>
(x -> m Bool) -> x -> m (Maybe x)
ifToMaybeM b -> m Bool
t forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l)
dimap a -> b
l c -> d
r (UnpackM b -> m (g c)
f) = forall (m :: * -> *) (g :: * -> *) x y.
(Monad m, Traversable g) =>
(x -> m (g y)) -> UnpackM m x y
UnpackM ( forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> m (g c)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l)
{-# INLINABLE dimap #-}
generalizeUnpack :: Monad m => Unpack x y -> UnpackM m x y
generalizeUnpack :: forall (m :: * -> *) x y. Monad m => Unpack x y -> UnpackM m x y
generalizeUnpack (Filter x -> Bool
t) = forall (m :: * -> *) x. Monad m => (x -> m Bool) -> UnpackM m x x
FilterM forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Bool
t
generalizeUnpack (Unpack x -> g y
f) = forall (m :: * -> *) (g :: * -> *) x y.
(Monad m, Traversable g) =>
(x -> m (g y)) -> UnpackM m x y
UnpackM forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> g y
f
{-# INLINABLE generalizeUnpack #-}
data Assign k y c where
Assign :: (y -> (k, c)) -> Assign k y c
instance Functor (Assign k y) where
fmap :: forall a b. (a -> b) -> Assign k y a -> Assign k y b
fmap a -> b
f (Assign y -> (k, a)
h) = forall y k c. (y -> (k, c)) -> Assign k y c
Assign forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. y -> (k, a)
h
{-# INLINABLE fmap #-}
instance Profunctor (Assign k) where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> Assign k b c -> Assign k a d
dimap a -> b
l c -> d
r (Assign b -> (k, c)
h) = forall y k c. (y -> (k, c)) -> Assign k y c
Assign forall a b. (a -> b) -> a -> b
$ forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second c -> d
r forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> (k, c)
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l
{-# INLINABLE dimap #-}
data AssignM m k y c where
AssignM :: Monad m => (y -> m (k, c)) -> AssignM m k y c
instance Functor (AssignM m k y) where
fmap :: forall a b. (a -> b) -> AssignM m k y a -> AssignM m k y b
fmap a -> b
f (AssignM y -> m (k, a)
h) = forall (m :: * -> *) y k c.
Monad m =>
(y -> m (k, c)) -> AssignM m k y c
AssignM forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second a -> b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. y -> m (k, a)
h
{-# INLINABLE fmap #-}
instance Profunctor (AssignM m k) where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> AssignM m k b c -> AssignM m k a d
dimap a -> b
l c -> d
r (AssignM b -> m (k, c)
h) = forall (m :: * -> *) y k c.
Monad m =>
(y -> m (k, c)) -> AssignM m k y c
AssignM forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second c -> d
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> m (k, c)
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l
{-# INLINABLE dimap #-}
generalizeAssign :: Monad m => Assign k y c -> AssignM m k y c
generalizeAssign :: forall (m :: * -> *) k y c.
Monad m =>
Assign k y c -> AssignM m k y c
generalizeAssign (Assign y -> (k, c)
h) = forall (m :: * -> *) y k c.
Monad m =>
(y -> m (k, c)) -> AssignM m k y c
AssignM forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. y -> (k, c)
h
{-# INLINABLE generalizeAssign #-}
data Reduce k x d where
Reduce :: (k -> (forall h. (Foldable h, Functor h) => (h x -> d))) -> Reduce k x d
ReduceFold :: (k -> FL.Fold x d) -> Reduce k x d
data ReduceM m k x d where
ReduceM :: Monad m => (k -> (forall h. (Foldable h, Functor h) => (h x -> m d))) -> ReduceM m k x d
ReduceFoldM :: Monad m => (k -> FL.FoldM m x d) -> ReduceM m k x d
instance Functor (Reduce k x) where
fmap :: forall a b. (a -> b) -> Reduce k x a -> Reduce k x b
fmap a -> b
f (Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
g) = forall k x d.
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d)
-> Reduce k x d
Reduce forall a b. (a -> b) -> a -> b
$ \k
k -> a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
g k
k
fmap a -> b
f (ReduceFold k -> Fold x a
g) = forall k x d. (k -> Fold x d) -> Reduce k x d
ReduceFold forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (k -> Fold x a
g k
k)
{-# INLINABLE fmap #-}
instance Functor (ReduceM m k x) where
fmap :: forall a b. (a -> b) -> ReduceM m k x a -> ReduceM m k x b
fmap a -> b
f (ReduceM k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
g) = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
g k
k
fmap a -> b
f (ReduceFoldM k -> FoldM m x a
g) = forall (m :: * -> *) k x d.
Monad m =>
(k -> FoldM m x d) -> ReduceM m k x d
ReduceFoldM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (k -> FoldM m x a
g k
k)
{-# INLINABLE fmap #-}
instance Profunctor (Reduce k) where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> Reduce k b c -> Reduce k a d
dimap a -> b
l c -> d
r (Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h b -> c
g) = forall k x d.
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d)
-> Reduce k x d
Reduce forall a b. (a -> b) -> a -> b
$ \k
k -> forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
l) c -> d
r (k -> forall (h :: * -> *). (Foldable h, Functor h) => h b -> c
g k
k)
dimap a -> b
l c -> d
r (ReduceFold k -> Fold b c
g) = forall k x d. (k -> Fold x d) -> Reduce k x d
ReduceFold forall a b. (a -> b) -> a -> b
$ \k
k -> forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap a -> b
l c -> d
r (k -> Fold b c
g k
k)
{-# INLINABLE dimap #-}
instance Profunctor (ReduceM m k) where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> ReduceM m k b c -> ReduceM m k a d
dimap a -> b
l c -> d
r (ReduceM k -> forall (h :: * -> *). (Foldable h, Functor h) => h b -> m c
g) = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
l) (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r) (k -> forall (h :: * -> *). (Foldable h, Functor h) => h b -> m c
g k
k)
dimap a -> b
l c -> d
r (ReduceFoldM k -> FoldM m b c
g) = forall (m :: * -> *) k x d.
Monad m =>
(k -> FoldM m x d) -> ReduceM m k x d
ReduceFoldM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap a -> b
l c -> d
r (k -> FoldM m b c
g k
k)
{-# INLINABLE dimap #-}
instance Applicative (Reduce k x) where
pure :: forall a. a -> Reduce k x a
pure a
x = forall k x d. (k -> Fold x d) -> Reduce k x d
ReduceFold forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
{-# INLINABLE pure #-}
Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a -> b
r1 <*> :: forall a b. Reduce k x (a -> b) -> Reduce k x a -> Reduce k x b
<*> Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
r2 = forall k x d.
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d)
-> Reduce k x d
Reduce forall a b. (a -> b) -> a -> b
$ \k
k -> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a -> b
r1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
r2 k
k
ReduceFold k -> Fold x (a -> b)
f1 <*> ReduceFold k -> Fold x a
f2 = forall k x d. (k -> Fold x d) -> Reduce k x d
ReduceFold forall a b. (a -> b) -> a -> b
$ \k
k -> k -> Fold x (a -> b)
f1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> Fold x a
f2 k
k
Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a -> b
r1 <*> ReduceFold k -> Fold x a
f2 = forall k x d.
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d)
-> Reduce k x d
Reduce forall a b. (a -> b) -> a -> b
$ \k
k -> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a -> b
r1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a b. Foldable f => Fold a b -> f a -> b
FL.fold (k -> Fold x a
f2 k
k)
ReduceFold k -> Fold x (a -> b)
f1 <*> Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
r2 = forall k x d.
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d)
-> Reduce k x d
Reduce forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Foldable f => Fold a b -> f a -> b
FL.fold (k -> Fold x (a -> b)
f1 k
k) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> a
r2 k
k
{-# INLINABLE (<*>) #-}
instance Monad m => Applicative (ReduceM m k x) where
pure :: forall a. a -> ReduceM m k x a
pure a
x = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
{-# INLINABLE pure #-}
ReduceM k
-> forall (h :: * -> *).
(Foldable h, Functor h) =>
h x -> m (a -> b)
r1 <*> :: forall a b.
ReduceM m k x (a -> b) -> ReduceM m k x a -> ReduceM m k x b
<*> ReduceM k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
r2 = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k
-> forall (h :: * -> *).
(Foldable h, Functor h) =>
h x -> m (a -> b)
r1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
r2 k
k
ReduceFoldM k -> FoldM m x (a -> b)
f1 <*> ReduceFoldM k -> FoldM m x a
f2 = forall (m :: * -> *) k x d.
Monad m =>
(k -> FoldM m x d) -> ReduceM m k x d
ReduceFoldM forall a b. (a -> b) -> a -> b
$ \k
k -> k -> FoldM m x (a -> b)
f1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> FoldM m x a
f2 k
k
ReduceM k
-> forall (h :: * -> *).
(Foldable h, Functor h) =>
h x -> m (a -> b)
r1 <*> ReduceFoldM k -> FoldM m x a
f2 = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k
-> forall (h :: * -> *).
(Foldable h, Functor h) =>
h x -> m (a -> b)
r1 k
k forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) (m :: * -> *) a b.
(Foldable f, Monad m) =>
FoldM m a b -> f a -> m b
FL.foldM (k -> FoldM m x a
f2 k
k)
ReduceFoldM k -> FoldM m x (a -> b)
f1 <*> ReduceM k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
r2 = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) (m :: * -> *) a b.
(Foldable f, Monad m) =>
FoldM m a b -> f a -> m b
FL.foldM (k -> FoldM m x (a -> b)
f1 k
k) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m a
r2 k
k
{-# INLINABLE (<*>) #-}
generalizeReduce :: Monad m => Reduce k x d -> ReduceM m k x d
generalizeReduce :: forall (m :: * -> *) k x d.
Monad m =>
Reduce k x d -> ReduceM m k x d
generalizeReduce (Reduce k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d
f) = forall (m :: * -> *) k x d.
Monad m =>
(k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> m d)
-> ReduceM m k x d
ReduceM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> forall (h :: * -> *). (Foldable h, Functor h) => h x -> d
f k
k
generalizeReduce (ReduceFold k -> Fold x d
f) = forall (m :: * -> *) k x d.
Monad m =>
(k -> FoldM m x d) -> ReduceM m k x d
ReduceFoldM forall a b. (a -> b) -> a -> b
$ \k
k -> forall (m :: * -> *) a b. Monad m => Fold a b -> FoldM m a b
FL.generalize (k -> Fold x d
f k
k)
{-# INLINABLE generalizeReduce #-}
postMapM :: Monad m => (a -> m b) -> FL.FoldM m x a -> FL.FoldM m x b
postMapM :: forall (m :: * -> *) a b x.
Monad m =>
(a -> m b) -> FoldM m x a -> FoldM m x b
postMapM a -> m b
f (FL.FoldM x -> x -> m x
step m x
begin x -> m a
done) = forall (m :: * -> *) a b x.
(x -> a -> m x) -> m x -> (x -> m b) -> FoldM m a b
FL.FoldM x -> x -> m x
step m x
begin x -> m b
done'
where done' :: x -> m b
done' x
x = x -> m a
done x
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m b
f
{-# INLINABLE postMapM #-}
seqF :: FL.Fold a (S.Seq a)
seqF :: forall a. Fold a (Seq a)
seqF = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
FL.Fold forall a. Seq a -> a -> Seq a
(S.|>) forall a. Seq a
S.empty forall a. a -> a
id
functionToFold :: (forall h . Foldable h => h x -> a) -> FL.Fold x a
functionToFold :: forall x a.
(forall (h :: * -> *). Foldable h => h x -> a) -> Fold x a
functionToFold forall (h :: * -> *). Foldable h => h x -> a
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (h :: * -> *). Foldable h => h x -> a
f forall a. Fold a (Seq a)
seqF
functionToFoldM
:: Monad m => (forall h . Foldable h => h x -> m a) -> FL.FoldM m x a
functionToFoldM :: forall (m :: * -> *) x a.
Monad m =>
(forall (h :: * -> *). Foldable h => h x -> m a) -> FoldM m x a
functionToFoldM forall (h :: * -> *). Foldable h => h x -> m a
f = forall (m :: * -> *) a b x.
Monad m =>
(a -> m b) -> FoldM m x a -> FoldM m x b
postMapM forall (h :: * -> *). Foldable h => h x -> m a
f forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a b. Monad m => Fold a b -> FoldM m a b
FL.generalize forall a. Fold a (Seq a)
seqF