module Streamly.Internal.Data.Fold.Container
(
toSet
, toIntSet
, countDistinct
, countDistinctInt
, nub
, nubInt
, frequency
, demuxKvToContainer
, demuxKvToMap
, demuxToContainer
, demuxToContainerIO
, demuxToMap
, demuxToMapIO
, demuxGeneric
, demux
, demuxGenericIO
, demuxIO
, kvToMap
, toContainer
, toContainerIO
, toMap
, toMapIO
, classifyGeneric
, classify
, classifyGenericIO
, classifyIO
)
where
#include "inline.hs"
#include "ArrayMacros.h"
import Control.Monad.IO.Class (MonadIO(..))
import Data.IORef (newIORef, readIORef, writeIORef)
import Data.Map.Strict (Map)
import Data.IntSet (IntSet)
import Data.Set (Set)
import Streamly.Internal.Data.IsMap (IsMap(..))
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..), Tuple3'(..))
import qualified Data.IntSet as IntSet
import qualified Data.Set as Set
import qualified Streamly.Internal.Data.IsMap as IsMap
import Prelude hiding (length)
import Streamly.Internal.Data.Fold
{-# INLINE toSet #-}
toSet :: (Monad m, Ord a) => Fold m a (Set a)
toSet :: Fold m a (Set a)
toSet = (Set a -> a -> Set a) -> Set a -> Fold m a (Set a)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' ((a -> Set a -> Set a) -> Set a -> a -> Set a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert) Set a
forall a. Set a
Set.empty
{-# INLINE toIntSet #-}
toIntSet :: Monad m => Fold m Int IntSet
toIntSet :: Fold m Int IntSet
toIntSet = (IntSet -> Int -> IntSet) -> IntSet -> Fold m Int IntSet
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' ((Int -> IntSet -> IntSet) -> IntSet -> Int -> IntSet
forall a b c. (a -> b -> c) -> b -> a -> c
flip Int -> IntSet -> IntSet
IntSet.insert) IntSet
IntSet.empty
{-# INLINE nub #-}
nub :: (Monad m, Ord a) => Fold m a (Maybe a)
nub :: Fold m a (Maybe a)
nub = (Tuple' (Set a) (Maybe a) -> Maybe a)
-> Fold m a (Tuple' (Set a) (Maybe a)) -> Fold m a (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Tuple' Set a
_ Maybe a
x) -> Maybe a
x) (Fold m a (Tuple' (Set a) (Maybe a)) -> Fold m a (Maybe a))
-> Fold m a (Tuple' (Set a) (Maybe a)) -> Fold m a (Maybe a)
forall a b. (a -> b) -> a -> b
$ (Tuple' (Set a) (Maybe a) -> a -> Tuple' (Set a) (Maybe a))
-> Tuple' (Set a) (Maybe a) -> Fold m a (Tuple' (Set a) (Maybe a))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' Tuple' (Set a) (Maybe a) -> a -> Tuple' (Set a) (Maybe a)
forall a b.
Ord a =>
Tuple' (Set a) b -> a -> Tuple' (Set a) (Maybe a)
step Tuple' (Set a) (Maybe a)
forall a a. Tuple' (Set a) (Maybe a)
initial
where
initial :: Tuple' (Set a) (Maybe a)
initial = Set a -> Maybe a -> Tuple' (Set a) (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Set a
forall a. Set a
Set.empty Maybe a
forall a. Maybe a
Nothing
step :: Tuple' (Set a) b -> a -> Tuple' (Set a) (Maybe a)
step (Tuple' Set a
set b
_) a
x =
if a -> Set a -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member a
x Set a
set
then Set a -> Maybe a -> Tuple' (Set a) (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Set a
set Maybe a
forall a. Maybe a
Nothing
else Set a -> Maybe a -> Tuple' (Set a) (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
x Set a
set) (a -> Maybe a
forall a. a -> Maybe a
Just a
x)
{-# INLINE nubInt #-}
nubInt :: Monad m => Fold m Int (Maybe Int)
nubInt :: Fold m Int (Maybe Int)
nubInt = (Tuple' IntSet (Maybe Int) -> Maybe Int)
-> Fold m Int (Tuple' IntSet (Maybe Int)) -> Fold m Int (Maybe Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Tuple' IntSet
_ Maybe Int
x) -> Maybe Int
x) (Fold m Int (Tuple' IntSet (Maybe Int)) -> Fold m Int (Maybe Int))
-> Fold m Int (Tuple' IntSet (Maybe Int)) -> Fold m Int (Maybe Int)
forall a b. (a -> b) -> a -> b
$ (Tuple' IntSet (Maybe Int) -> Int -> Tuple' IntSet (Maybe Int))
-> Tuple' IntSet (Maybe Int)
-> Fold m Int (Tuple' IntSet (Maybe Int))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' Tuple' IntSet (Maybe Int) -> Int -> Tuple' IntSet (Maybe Int)
forall b. Tuple' IntSet b -> Int -> Tuple' IntSet (Maybe Int)
step Tuple' IntSet (Maybe Int)
forall a. Tuple' IntSet (Maybe a)
initial
where
initial :: Tuple' IntSet (Maybe a)
initial = IntSet -> Maybe a -> Tuple' IntSet (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' IntSet
IntSet.empty Maybe a
forall a. Maybe a
Nothing
step :: Tuple' IntSet b -> Int -> Tuple' IntSet (Maybe Int)
step (Tuple' IntSet
set b
_) Int
x =
if Int -> IntSet -> Bool
IntSet.member Int
x IntSet
set
then IntSet -> Maybe Int -> Tuple' IntSet (Maybe Int)
forall a b. a -> b -> Tuple' a b
Tuple' IntSet
set Maybe Int
forall a. Maybe a
Nothing
else IntSet -> Maybe Int -> Tuple' IntSet (Maybe Int)
forall a b. a -> b -> Tuple' a b
Tuple' (Int -> IntSet -> IntSet
IntSet.insert Int
x IntSet
set) (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
x)
{-# INLINE countDistinct #-}
countDistinct :: (Monad m, Ord a) => Fold m a Int
countDistinct :: Fold m a Int
countDistinct = (Set a -> Int) -> Fold m a (Set a) -> Fold m a Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Set a -> Int
forall a. Set a -> Int
Set.size Fold m a (Set a)
forall (m :: * -> *) a. (Monad m, Ord a) => Fold m a (Set a)
toSet
{-# INLINE countDistinctInt #-}
countDistinctInt :: Monad m => Fold m Int Int
countDistinctInt :: Fold m Int Int
countDistinctInt = (IntSet -> Int) -> Fold m Int IntSet -> Fold m Int Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntSet -> Int
IntSet.size Fold m Int IntSet
forall (m :: * -> *). Monad m => Fold m Int IntSet
toIntSet
{-# INLINE demuxGeneric #-}
demuxGeneric :: (Monad m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b))
-> Fold m a (m (f b), Maybe (Key f, b))
demuxGeneric :: (a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGeneric a -> Key f
getKey a -> m (Fold m a b)
getFold = (Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b))
forall (t :: * -> *) (m :: * -> *) a b b.
(Traversable t, Monad m) =>
Tuple' (t (Fold m a b)) b -> (m (t b), b)
extract (Fold m a (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall a b. (a -> b) -> a -> b
$ (Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> a -> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b))))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
-> Fold m a (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
foldlM' Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> a -> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall b.
Tuple' (f (Fold m a b)) b
-> a -> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
step m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall a a. m (Tuple' (f a) (Maybe a))
initial
where
initial :: m (Tuple' (f a) (Maybe a))
initial = Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a)))
-> Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ f a -> Maybe a -> Tuple' (f a) (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty Maybe a
forall a. Maybe a
Nothing
{-# INLINE runFold #-}
runFold :: f (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
runFold f (Fold m a b)
kv (Fold s -> a -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) (k, a) = do
Step s b
res <- m (Step s b)
initial1
case Step s b
res of
Partial s
s -> do
Step s b
res1 <- s -> a -> m (Step s b)
step1 s
s a
a
Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return
(Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b))))
-> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ case Step s b
res1 of
Partial s
_ ->
let fld :: Fold m a b
fld = (s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s b)
step1 (Step s b -> m (Step s b)
forall (m :: * -> *) a. Monad m => a -> m a
return Step s b
res1) s -> m b
extract1
in f (Fold m a b)
-> Maybe (Key f, b) -> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' (Key f -> Fold m a b -> f (Fold m a b) -> f (Fold m a b)
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k Fold m a b
fld f (Fold m a b)
kv) Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b -> f (Fold m a b)
-> Maybe (Key f, b) -> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' (Key f -> f (Fold m a b) -> f (Fold m a b)
forall (f :: * -> *) a. IsMap f => Key f -> f a -> f a
IsMap.mapDelete Key f
k f (Fold m a b)
kv) ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
Done b
b -> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b))))
-> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (Fold m a b)
-> Maybe (Key f, b) -> Tuple' (f (Fold m a b)) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' f (Fold m a b)
kv ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
step :: Tuple' (f (Fold m a b)) b
-> a -> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
step (Tuple' f (Fold m a b)
kv b
_) a
a = do
let k :: Key f
k = a -> Key f
getKey a
a
case Key f -> f (Fold m a b) -> Maybe (Fold m a b)
forall (f :: * -> *) a. IsMap f => Key f -> f a -> Maybe a
IsMap.mapLookup Key f
k f (Fold m a b)
kv of
Maybe (Fold m a b)
Nothing -> do
Fold m a b
fld <- a -> m (Fold m a b)
getFold a
a
f (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall (m :: * -> *) (f :: * -> *) a b.
(IsMap f, Monad m) =>
f (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
runFold f (Fold m a b)
kv Fold m a b
fld (Key f
k, a
a)
Just Fold m a b
f -> f (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
forall (m :: * -> *) (f :: * -> *) a b.
(IsMap f, Monad m) =>
f (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (Fold m a b)) (Maybe (Key f, b)))
runFold f (Fold m a b)
kv Fold m a b
f (Key f
k, a
a)
extract :: Tuple' (t (Fold m a b)) b -> (m (t b), b)
extract (Tuple' t (Fold m a b)
kv b
x) = ((Fold m a b -> m b) -> t (Fold m a b) -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Prelude.mapM Fold m a b -> m b
forall (m :: * -> *) a b. Monad m => Fold m a b -> m b
f t (Fold m a b)
kv, b
x)
where
f :: Fold m a b -> m b
f (Fold s -> a -> m (Step s b)
_ m (Step s b)
i s -> m b
e) = do
Step s b
r <- m (Step s b)
i
case Step s b
r of
Partial s
s -> s -> m b
e s
s
Done b
b -> b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
b
{-# INLINE demux #-}
demux :: (Monad m, Ord k) =>
(a -> k)
-> (a -> m (Fold m a b))
-> Fold m a (m (Map k b), Maybe (k, b))
demux :: (a -> k)
-> (a -> m (Fold m a b)) -> Fold m a (m (Map k b), Maybe (k, b))
demux = (a -> k)
-> (a -> m (Fold m a b)) -> Fold m a (m (Map k b), Maybe (k, b))
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGeneric
{-# INLINE demuxGenericIO #-}
demuxGenericIO :: (MonadIO m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b))
-> Fold m a (m (f b), Maybe (Key f, b))
demuxGenericIO :: (a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGenericIO a -> Key f
getKey a -> m (Fold m a b)
getFold = (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b))
forall (t :: * -> *) (m :: * -> *) a b b.
(Traversable t, MonadIO m) =>
Tuple' (t (IORef (Fold m a b))) b -> (m (t b), b)
extract (Fold m a (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall a b. (a -> b) -> a -> b
$ (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> a -> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
-> Fold m a (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
foldlM' Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> a -> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall b.
Tuple' (f (IORef (Fold m a b))) b
-> a -> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
step m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall a a. m (Tuple' (f a) (Maybe a))
initial
where
initial :: m (Tuple' (f a) (Maybe a))
initial = Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a)))
-> Tuple' (f a) (Maybe a) -> m (Tuple' (f a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ f a -> Maybe a -> Tuple' (f a) (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty Maybe a
forall a. Maybe a
Nothing
{-# INLINE initFold #-}
initFold :: f (IORef (Fold m a b))
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
initFold f (IORef (Fold m a b))
kv (Fold s -> a -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) (k, a) = do
Step s b
res <- m (Step s b)
initial1
case Step s b
res of
Partial s
s -> do
Step s b
res1 <- s -> a -> m (Step s b)
step1 s
s a
a
case Step s b
res1 of
Partial s
_ -> do
let fld :: Fold m a b
fld = (s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s b)
step1 (Step s b -> m (Step s b)
forall (m :: * -> *) a. Monad m => a -> m a
return Step s b
res1) s -> m b
extract1
IORef (Fold m a b)
ref <- IO (IORef (Fold m a b)) -> m (IORef (Fold m a b))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (IORef (Fold m a b)) -> m (IORef (Fold m a b)))
-> IO (IORef (Fold m a b)) -> m (IORef (Fold m a b))
forall a b. (a -> b) -> a -> b
$ Fold m a b -> IO (IORef (Fold m a b))
forall a. a -> IO (IORef a)
newIORef Fold m a b
fld
Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))))
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef (Fold m a b))
-> Maybe (Key f, b)
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' (Key f
-> IORef (Fold m a b)
-> f (IORef (Fold m a b))
-> f (IORef (Fold m a b))
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k IORef (Fold m a b)
ref f (IORef (Fold m a b))
kv) Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b -> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))))
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef (Fold m a b))
-> Maybe (Key f, b)
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' f (IORef (Fold m a b))
kv ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
Done b
b -> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))))
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef (Fold m a b))
-> Maybe (Key f, b)
-> Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' f (IORef (Fold m a b))
kv ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
{-# INLINE runFold #-}
runFold :: f a
-> IORef (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f a) (Maybe (Key f, b)))
runFold f a
kv IORef (Fold m a b)
ref (Fold s -> a -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) (k, a) = do
Step s b
res <- m (Step s b)
initial1
case Step s b
res of
Partial s
s -> do
Step s b
res1 <- s -> a -> m (Step s b)
step1 s
s a
a
case Step s b
res1 of
Partial s
_ -> do
let fld :: Fold m a b
fld = (s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s b)
step1 (Step s b -> m (Step s b)
forall (m :: * -> *) a. Monad m => a -> m a
return Step s b
res1) s -> m b
extract1
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ IORef (Fold m a b) -> Fold m a b -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef (Fold m a b)
ref Fold m a b
fld
Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b))))
-> Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f a -> Maybe (Key f, b) -> Tuple' (f a) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' f a
kv Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b ->
let kv1 :: f a
kv1 = Key f -> f a -> f a
forall (f :: * -> *) a. IsMap f => Key f -> f a -> f a
IsMap.mapDelete Key f
k f a
kv
in Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b))))
-> Tuple' (f a) (Maybe (Key f, b))
-> m (Tuple' (f a) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f a -> Maybe (Key f, b) -> Tuple' (f a) (Maybe (Key f, b))
forall a b. a -> b -> Tuple' a b
Tuple' f a
kv1 ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
Done b
_ -> [Char] -> m (Tuple' (f a) (Maybe (Key f, b)))
forall a. HasCallStack => [Char] -> a
error [Char]
"demuxGenericIO: unreachable"
step :: Tuple' (f (IORef (Fold m a b))) b
-> a -> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
step (Tuple' f (IORef (Fold m a b))
kv b
_) a
a = do
let k :: Key f
k = a -> Key f
getKey a
a
case Key f -> f (IORef (Fold m a b)) -> Maybe (IORef (Fold m a b))
forall (f :: * -> *) a. IsMap f => Key f -> f a -> Maybe a
IsMap.mapLookup Key f
k f (IORef (Fold m a b))
kv of
Maybe (IORef (Fold m a b))
Nothing -> do
Fold m a b
f <- a -> m (Fold m a b)
getFold a
a
f (IORef (Fold m a b))
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f) =>
f (IORef (Fold m a b))
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
initFold f (IORef (Fold m a b))
kv Fold m a b
f (Key f
k, a
a)
Just IORef (Fold m a b)
ref -> do
Fold m a b
f <- IO (Fold m a b) -> m (Fold m a b)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Fold m a b) -> m (Fold m a b))
-> IO (Fold m a b) -> m (Fold m a b)
forall a b. (a -> b) -> a -> b
$ IORef (Fold m a b) -> IO (Fold m a b)
forall a. IORef a -> IO a
readIORef IORef (Fold m a b)
ref
f (IORef (Fold m a b))
-> IORef (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f (IORef (Fold m a b))) (Maybe (Key f, b)))
forall (m :: * -> *) (f :: * -> *) a a b.
(MonadIO m, IsMap f) =>
f a
-> IORef (Fold m a b)
-> Fold m a b
-> (Key f, a)
-> m (Tuple' (f a) (Maybe (Key f, b)))
runFold f (IORef (Fold m a b))
kv IORef (Fold m a b)
ref Fold m a b
f (Key f
k, a
a)
extract :: Tuple' (t (IORef (Fold m a b))) b -> (m (t b), b)
extract (Tuple' t (IORef (Fold m a b))
kv b
x) = ((IORef (Fold m a b) -> m b) -> t (IORef (Fold m a b)) -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Prelude.mapM IORef (Fold m a b) -> m b
forall (m :: * -> *) a b. MonadIO m => IORef (Fold m a b) -> m b
f t (IORef (Fold m a b))
kv, b
x)
where
f :: IORef (Fold m a b) -> m b
f IORef (Fold m a b)
ref = do
(Fold s -> a -> m (Step s b)
_ m (Step s b)
i s -> m b
e) <- IO (Fold m a b) -> m (Fold m a b)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Fold m a b) -> m (Fold m a b))
-> IO (Fold m a b) -> m (Fold m a b)
forall a b. (a -> b) -> a -> b
$ IORef (Fold m a b) -> IO (Fold m a b)
forall a. IORef a -> IO a
readIORef IORef (Fold m a b)
ref
Step s b
r <- m (Step s b)
i
case Step s b
r of
Partial s
s -> s -> m b
e s
s
Done b
b -> b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
b
{-# INLINE demuxIO #-}
demuxIO :: (MonadIO m, Ord k) =>
(a -> k)
-> (a -> m (Fold m a b))
-> Fold m a (m (Map k b), Maybe (k, b))
demuxIO :: (a -> k)
-> (a -> m (Fold m a b)) -> Fold m a (m (Map k b), Maybe (k, b))
demuxIO = (a -> k)
-> (a -> m (Fold m a b)) -> Fold m a (m (Map k b), Maybe (k, b))
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGenericIO
{-# INLINE demuxToContainer #-}
demuxToContainer :: (Monad m, IsMap f, Traversable f) =>
(a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainer :: (a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainer a -> Key f
getKey a -> m (Fold m a b)
getFold =
let
classifier :: Fold m a (m (f b), Maybe (Key f, b))
classifier = (a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGeneric a -> Key f
getKey a -> m (Fold m a b)
getFold
getMap :: Maybe (f (f a)) -> f (f a)
getMap Maybe (f (f a))
Nothing = f a -> f (f a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty
getMap (Just f (f a)
action) = f (f a)
action
aggregator :: Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator =
(f a -> f a -> f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith f a -> f a -> f a
forall (f :: * -> *) a. IsMap f => f a -> f a -> f a
IsMap.mapUnion
((Maybe (m (f a)) -> m (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM Maybe (m (f a)) -> m (f a)
forall (f :: * -> *) (f :: * -> *) a.
(Applicative f, IsMap f) =>
Maybe (f (f a)) -> f (f a)
getMap (Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ ((m (f a), Maybe (Key f, a)) -> m (f a))
-> Fold m (m (f a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> m (f a)
forall a b. (a, b) -> a
fst Fold m (m (f a)) (Maybe (m (f a)))
forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest)
(((m (f a), Maybe (Key f, a)) -> Maybe (Key f, a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> Maybe (Key f, a)
forall a b. (a, b) -> b
snd (Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ Fold m (Key f, a) (f a) -> Fold m (Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes Fold m (Key f, a) (f a)
forall (m :: * -> *) (f :: * -> *) a.
(Monad m, IsMap f) =>
Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric)
in Fold m a (m (f b), Maybe (Key f, b))
-> Fold m (m (f b), Maybe (Key f, b)) (f b) -> Fold m a (f b)
forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
postscan Fold m a (m (f b), Maybe (Key f, b))
classifier Fold m (m (f b), Maybe (Key f, b)) (f b)
forall a. Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator
{-# INLINE demuxToMap #-}
demuxToMap :: (Monad m, Ord k) =>
(a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
demuxToMap :: (a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
demuxToMap = (a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f) =>
(a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainer
{-# INLINE demuxToContainerIO #-}
demuxToContainerIO :: (MonadIO m, IsMap f, Traversable f) =>
(a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainerIO :: (a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainerIO a -> Key f
getKey a -> m (Fold m a b)
getFold =
let
classifier :: Fold m a (m (f b), Maybe (Key f, b))
classifier = (a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f) =>
(a -> Key f)
-> (a -> m (Fold m a b)) -> Fold m a (m (f b), Maybe (Key f, b))
demuxGenericIO a -> Key f
getKey a -> m (Fold m a b)
getFold
getMap :: Maybe (f (f a)) -> f (f a)
getMap Maybe (f (f a))
Nothing = f a -> f (f a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty
getMap (Just f (f a)
action) = f (f a)
action
aggregator :: Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator =
(f a -> f a -> f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith f a -> f a -> f a
forall (f :: * -> *) a. IsMap f => f a -> f a -> f a
IsMap.mapUnion
((Maybe (m (f a)) -> m (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM Maybe (m (f a)) -> m (f a)
forall (f :: * -> *) (f :: * -> *) a.
(Applicative f, IsMap f) =>
Maybe (f (f a)) -> f (f a)
getMap (Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ ((m (f a), Maybe (Key f, a)) -> m (f a))
-> Fold m (m (f a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> m (f a)
forall a b. (a, b) -> a
fst Fold m (m (f a)) (Maybe (m (f a)))
forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest)
(((m (f a), Maybe (Key f, a)) -> Maybe (Key f, a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> Maybe (Key f, a)
forall a b. (a, b) -> b
snd (Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ Fold m (Key f, a) (f a) -> Fold m (Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes Fold m (Key f, a) (f a)
forall (m :: * -> *) (f :: * -> *) a.
(Monad m, IsMap f) =>
Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric)
in Fold m a (m (f b), Maybe (Key f, b))
-> Fold m (m (f b), Maybe (Key f, b)) (f b) -> Fold m a (f b)
forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
postscan Fold m a (m (f b), Maybe (Key f, b))
classifier Fold m (m (f b), Maybe (Key f, b)) (f b)
forall a. Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator
{-# INLINE demuxToMapIO #-}
demuxToMapIO :: (MonadIO m, Ord k) =>
(a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
demuxToMapIO :: (a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
demuxToMapIO = (a -> k) -> (a -> m (Fold m a b)) -> Fold m a (Map k b)
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f) =>
(a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainerIO
{-# INLINE demuxKvToContainer #-}
demuxKvToContainer :: (Monad m, IsMap f, Traversable f) =>
(Key f -> m (Fold m a b)) -> Fold m (Key f, a) (f b)
demuxKvToContainer :: (Key f -> m (Fold m a b)) -> Fold m (Key f, a) (f b)
demuxKvToContainer Key f -> m (Fold m a b)
f = ((Key f, a) -> Key f)
-> ((Key f, a) -> m (Fold m (Key f, a) b))
-> Fold m (Key f, a) (f b)
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f) =>
(a -> Key f) -> (a -> m (Fold m a b)) -> Fold m a (f b)
demuxToContainer (Key f, a) -> Key f
forall a b. (a, b) -> a
fst (\(Key f
k, a
_) -> (Fold m a b -> Fold m (Key f, a) b)
-> m (Fold m a b) -> m (Fold m (Key f, a) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((Key f, a) -> a) -> Fold m a b -> Fold m (Key f, a) b
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (Key f, a) -> a
forall a b. (a, b) -> b
snd) (Key f -> m (Fold m a b)
f Key f
k))
{-# INLINE demuxKvToMap #-}
demuxKvToMap :: (Monad m, Ord k) =>
(k -> m (Fold m a b)) -> Fold m (k, a) (Map k b)
demuxKvToMap :: (k -> m (Fold m a b)) -> Fold m (k, a) (Map k b)
demuxKvToMap = (k -> m (Fold m a b)) -> Fold m (k, a) (Map k b)
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f) =>
(Key f -> m (Fold m a b)) -> Fold m (Key f, a) (f b)
demuxKvToContainer
{-# INLINE classifyGeneric #-}
classifyGeneric :: (Monad m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGeneric :: (a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGeneric a -> Key f
f (Fold s -> a -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) =
(Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b))
forall (t :: * -> *) b b.
Traversable t =>
Tuple3' (t s) b b -> (m (t b), b)
extract (Fold m a (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b)))
-> Fold m a (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall a b. (a -> b) -> a -> b
$ (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> a -> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
foldlM' Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> a -> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall c.
Tuple3' (f s) (Set (Key f)) c
-> a -> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
step m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall a a a. m (Tuple3' (f a) (Set a) (Maybe a))
initial
where
initial :: m (Tuple3' (f a) (Set a) (Maybe a))
initial = Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a)))
-> Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ f a -> Set a -> Maybe a -> Tuple3' (f a) (Set a) (Maybe a)
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty Set a
forall a. Set a
Set.empty Maybe a
forall a. Maybe a
Nothing
{-# INLINE initFold #-}
initFold :: f s
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
initFold f s
kv Set (Key f)
set Key f
k a
a = do
Step s b
x <- m (Step s b)
initial1
case Step s b
x of
Partial s
s -> do
Step s b
r <- s -> a -> m (Step s b)
step1 s
s a
a
Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return
(Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Partial s
s1 ->
f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (Key f -> s -> f s -> f s
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k s
s1 f s
kv) Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b ->
f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f s
kv Set (Key f)
set ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
Done b
b -> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f s
kv (Key f -> Set (Key f) -> Set (Key f)
forall a. Ord a => a -> Set a -> Set a
Set.insert Key f
k Set (Key f)
set) ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b)))
step :: Tuple3' (f s) (Set (Key f)) c
-> a -> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
step (Tuple3' f s
kv Set (Key f)
set c
_) a
a = do
let k :: Key f
k = a -> Key f
f a
a
case Key f -> f s -> Maybe s
forall (f :: * -> *) a. IsMap f => Key f -> f a -> Maybe a
IsMap.mapLookup Key f
k f s
kv of
Maybe s
Nothing -> do
if Key f -> Set (Key f) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Key f
k Set (Key f)
set
then Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f s
kv Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing)
else f s
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (f :: * -> *).
(IsMap f, Ord (Key f)) =>
f s
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
initFold f s
kv Set (Key f)
set Key f
k a
a
Just s
s -> do
Step s b
r <- s -> a -> m (Step s b)
step1 s
s a
a
Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return
(Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Partial s
s1 ->
f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (Key f -> s -> f s -> f s
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k s
s1 f s
kv) Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b ->
let kv1 :: f s
kv1 = Key f -> f s -> f s
forall (f :: * -> *) a. IsMap f => Key f -> f a -> f a
IsMap.mapDelete Key f
k f s
kv
in f s
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f s) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f s
kv1 (Key f -> Set (Key f) -> Set (Key f)
forall a. Ord a => a -> Set a -> Set a
Set.insert Key f
k Set (Key f)
set) ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
extract :: Tuple3' (t s) b b -> (m (t b), b)
extract (Tuple3' t s
kv b
_ b
x) = ((s -> m b) -> t s -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Prelude.mapM s -> m b
extract1 t s
kv, b
x)
{-# INLINE classify #-}
classify :: (Monad m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
classify :: (a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
classify = (a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGeneric
{-# INLINE classifyGenericIO #-}
classifyGenericIO :: (MonadIO m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGenericIO :: (a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGenericIO a -> Key f
f (Fold s -> a -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) =
(Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b)))
-> Fold
m a (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> (m (f b), Maybe (Key f, b))
forall (t :: * -> *) b b.
Traversable t =>
Tuple3' (t (IORef s)) b b -> (m (t b), b)
extract (Fold m a (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b)))
-> Fold
m a (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
-> Fold m a (m (f b), Maybe (Key f, b))
forall a b. (a -> b) -> a -> b
$ (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> a -> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
-> Fold
m a (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
foldlM' Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> a -> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall c.
Tuple3' (f (IORef s)) (Set (Key f)) c
-> a -> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
step m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall a a a. m (Tuple3' (f a) (Set a) (Maybe a))
initial
where
initial :: m (Tuple3' (f a) (Set a) (Maybe a))
initial = Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a)))
-> Tuple3' (f a) (Set a) (Maybe a)
-> m (Tuple3' (f a) (Set a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ f a -> Set a -> Maybe a -> Tuple3' (f a) (Set a) (Maybe a)
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty Set a
forall a. Set a
Set.empty Maybe a
forall a. Maybe a
Nothing
{-# INLINE initFold #-}
initFold :: f (IORef s)
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
initFold f (IORef s)
kv Set (Key f)
set Key f
k a
a = do
Step s b
x <- m (Step s b)
initial1
case Step s b
x of
Partial s
s -> do
Step s b
r <- s -> a -> m (Step s b)
step1 s
s a
a
case Step s b
r of
Partial s
s1 -> do
IORef s
ref <- IO (IORef s) -> m (IORef s)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (IORef s) -> m (IORef s)) -> IO (IORef s) -> m (IORef s)
forall a b. (a -> b) -> a -> b
$ s -> IO (IORef s)
forall a. a -> IO (IORef a)
newIORef s
s1
Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (Key f -> IORef s -> f (IORef s) -> f (IORef s)
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k IORef s
ref f (IORef s)
kv) Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b ->
Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f (IORef s)
kv Set (Key f)
set ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
Done b
b -> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f (IORef s)
kv (Key f -> Set (Key f) -> Set (Key f)
forall a. Ord a => a -> Set a -> Set a
Set.insert Key f
k Set (Key f)
set) ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b)))
step :: Tuple3' (f (IORef s)) (Set (Key f)) c
-> a -> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
step (Tuple3' f (IORef s)
kv Set (Key f)
set c
_) a
a = do
let k :: Key f
k = a -> Key f
f a
a
case Key f -> f (IORef s) -> Maybe (IORef s)
forall (f :: * -> *) a. IsMap f => Key f -> f a -> Maybe a
IsMap.mapLookup Key f
k f (IORef s)
kv of
Maybe (IORef s)
Nothing -> do
if Key f -> Set (Key f) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Key f
k Set (Key f)
set
then Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f (IORef s)
kv Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing)
else f (IORef s)
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (f :: * -> *).
(IsMap f, Ord (Key f)) =>
f (IORef s)
-> Set (Key f)
-> Key f
-> a
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
initFold f (IORef s)
kv Set (Key f)
set Key f
k a
a
Just IORef s
ref -> do
s
s <- IO s -> m s
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO s -> m s) -> IO s -> m s
forall a b. (a -> b) -> a -> b
$ IORef s -> IO s
forall a. IORef a -> IO a
readIORef IORef s
ref
Step s b
r <- s -> a -> m (Step s b)
step1 s
s a
a
case Step s b
r of
Partial s
s1 -> do
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ IORef s -> s -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef s
ref s
s1
Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f (IORef s)
kv Set (Key f)
set Maybe (Key f, b)
forall a. Maybe a
Nothing
Done b
b ->
let kv1 :: f (IORef s)
kv1 = Key f -> f (IORef s) -> f (IORef s)
forall (f :: * -> *) a. IsMap f => Key f -> f a -> f a
IsMap.mapDelete Key f
k f (IORef s)
kv
in Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall (m :: * -> *) a. Monad m => a -> m a
return
(Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))))
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
-> m (Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b)))
forall a b. (a -> b) -> a -> b
$ f (IORef s)
-> Set (Key f)
-> Maybe (Key f, b)
-> Tuple3' (f (IORef s)) (Set (Key f)) (Maybe (Key f, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' f (IORef s)
kv1 (Key f -> Set (Key f) -> Set (Key f)
forall a. Ord a => a -> Set a -> Set a
Set.insert Key f
k Set (Key f)
set) ((Key f, b) -> Maybe (Key f, b)
forall a. a -> Maybe a
Just (Key f
k, b
b))
extract :: Tuple3' (t (IORef s)) b b -> (m (t b), b)
extract (Tuple3' t (IORef s)
kv b
_ b
x) =
((IORef s -> m b) -> t (IORef s) -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Prelude.mapM (\IORef s
ref -> IO s -> m s
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IORef s -> IO s
forall a. IORef a -> IO a
readIORef IORef s
ref) m s -> (s -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= s -> m b
extract1) t (IORef s)
kv, b
x)
{-# INLINE classifyIO #-}
classifyIO :: (MonadIO m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
classifyIO :: (a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
classifyIO = (a -> k) -> Fold m a b -> Fold m a (m (Map k b), Maybe (k, b))
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGenericIO
{-# INLINE kvToMapOverwriteGeneric #-}
kvToMapOverwriteGeneric :: (Monad m, IsMap f) => Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric :: Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric =
(f a -> (Key f, a) -> f a) -> f a -> Fold m (Key f, a) (f a)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' (\f a
kv (Key f
k, a
v) -> Key f -> a -> f a -> f a
forall (f :: * -> *) a. IsMap f => Key f -> a -> f a -> f a
IsMap.mapInsert Key f
k a
v f a
kv) f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty
{-# INLINE toContainer #-}
toContainer :: (Monad m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainer :: (a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainer a -> Key f
f Fold m a b
fld =
let
classifier :: Fold m a (m (f b), Maybe (Key f, b))
classifier = (a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGeneric a -> Key f
f Fold m a b
fld
getMap :: Maybe (f (f a)) -> f (f a)
getMap Maybe (f (f a))
Nothing = f a -> f (f a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty
getMap (Just f (f a)
action) = f (f a)
action
aggregator :: Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator =
(f a -> f a -> f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith f a -> f a -> f a
forall (f :: * -> *) a. IsMap f => f a -> f a -> f a
IsMap.mapUnion
((Maybe (m (f a)) -> m (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM Maybe (m (f a)) -> m (f a)
forall (f :: * -> *) (f :: * -> *) a.
(Applicative f, IsMap f) =>
Maybe (f (f a)) -> f (f a)
getMap (Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ ((m (f a), Maybe (Key f, a)) -> m (f a))
-> Fold m (m (f a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> m (f a)
forall a b. (a, b) -> a
fst Fold m (m (f a)) (Maybe (m (f a)))
forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest)
(((m (f a), Maybe (Key f, a)) -> Maybe (Key f, a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> Maybe (Key f, a)
forall a b. (a, b) -> b
snd (Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ Fold m (Key f, a) (f a) -> Fold m (Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes Fold m (Key f, a) (f a)
forall (m :: * -> *) (f :: * -> *) a.
(Monad m, IsMap f) =>
Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric)
in Fold m a (m (f b), Maybe (Key f, b))
-> Fold m (m (f b), Maybe (Key f, b)) (f b) -> Fold m a (f b)
forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
postscan Fold m a (m (f b), Maybe (Key f, b))
classifier Fold m (m (f b), Maybe (Key f, b)) (f b)
forall a. Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator
{-# INLINE toMap #-}
toMap :: (Monad m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (Map k b)
toMap :: (a -> k) -> Fold m a b -> Fold m a (Map k b)
toMap = (a -> k) -> Fold m a b -> Fold m a (Map k b)
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainer
{-# INLINE toContainerIO #-}
toContainerIO :: (MonadIO m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainerIO :: (a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainerIO a -> Key f
f Fold m a b
fld =
let
classifier :: Fold m a (m (f b), Maybe (Key f, b))
classifier = (a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (m (f b), Maybe (Key f, b))
classifyGenericIO a -> Key f
f Fold m a b
fld
getMap :: Maybe (f (f a)) -> f (f a)
getMap Maybe (f (f a))
Nothing = f a -> f (f a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure f a
forall (f :: * -> *) a. IsMap f => f a
IsMap.mapEmpty
getMap (Just f (f a)
action) = f (f a)
action
aggregator :: Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator =
(f a -> f a -> f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith f a -> f a -> f a
forall (f :: * -> *) a. IsMap f => f a -> f a -> f a
IsMap.mapUnion
((Maybe (m (f a)) -> m (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM Maybe (m (f a)) -> m (f a)
forall (f :: * -> *) (f :: * -> *) a.
(Applicative f, IsMap f) =>
Maybe (f (f a)) -> f (f a)
getMap (Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ ((m (f a), Maybe (Key f, a)) -> m (f a))
-> Fold m (m (f a)) (Maybe (m (f a)))
-> Fold m (m (f a), Maybe (Key f, a)) (Maybe (m (f a)))
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> m (f a)
forall a b. (a, b) -> a
fst Fold m (m (f a)) (Maybe (m (f a)))
forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest)
(((m (f a), Maybe (Key f, a)) -> Maybe (Key f, a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (m (f a), Maybe (Key f, a)) -> Maybe (Key f, a)
forall a b. (a, b) -> b
snd (Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a))
-> Fold m (Maybe (Key f, a)) (f a)
-> Fold m (m (f a), Maybe (Key f, a)) (f a)
forall a b. (a -> b) -> a -> b
$ Fold m (Key f, a) (f a) -> Fold m (Maybe (Key f, a)) (f a)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes Fold m (Key f, a) (f a)
forall (m :: * -> *) (f :: * -> *) a.
(Monad m, IsMap f) =>
Fold m (Key f, a) (f a)
kvToMapOverwriteGeneric)
in Fold m a (m (f b), Maybe (Key f, b))
-> Fold m (m (f b), Maybe (Key f, b)) (f b) -> Fold m a (f b)
forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
postscan Fold m a (m (f b), Maybe (Key f, b))
classifier Fold m (m (f b), Maybe (Key f, b)) (f b)
forall a. Fold m (m (f a), Maybe (Key f, a)) (f a)
aggregator
{-# INLINE toMapIO #-}
toMapIO :: (MonadIO m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (Map k b)
toMapIO :: (a -> k) -> Fold m a b -> Fold m a (Map k b)
toMapIO = (a -> k) -> Fold m a b -> Fold m a (Map k b)
forall (m :: * -> *) (f :: * -> *) a b.
(MonadIO m, IsMap f, Traversable f, Ord (Key f)) =>
(a -> Key f) -> Fold m a b -> Fold m a (f b)
toContainerIO
{-# INLINE kvToMap #-}
kvToMap :: (Monad m, Ord k) => Fold m a b -> Fold m (k, a) (Map k b)
kvToMap :: Fold m a b -> Fold m (k, a) (Map k b)
kvToMap = ((k, a) -> k) -> Fold m (k, a) b -> Fold m (k, a) (Map k b)
forall (m :: * -> *) k a b.
(Monad m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (Map k b)
toMap (k, a) -> k
forall a b. (a, b) -> a
fst (Fold m (k, a) b -> Fold m (k, a) (Map k b))
-> (Fold m a b -> Fold m (k, a) b)
-> Fold m a b
-> Fold m (k, a) (Map k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((k, a) -> a) -> Fold m a b -> Fold m (k, a) b
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (k, a) -> a
forall a b. (a, b) -> b
snd
{-# INLINE frequency #-}
frequency :: (Monad m, Ord a) => Fold m a (Map a Int)
frequency :: Fold m a (Map a Int)
frequency = (a -> a) -> Fold m a Int -> Fold m a (Map a Int)
forall (m :: * -> *) k a b.
(Monad m, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (Map k b)
toMap a -> a
forall a. a -> a
id Fold m a Int
forall (m :: * -> *) a. Monad m => Fold m a Int
length