{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
module Frames.Folds.General
(
EndoFold
, FoldEndo(..)
, FoldRecord(..)
, EndoFieldFoldsToRecordFolds
, ConstrainedField
, toFoldRecord
, recFieldF
, fieldToFieldFold
, sequenceRecFold
, sequenceEndoFolds
, foldAll
, foldAllConstrained
, functorFoldAllConstrained
, foldAllMonoid
)
where
import Frames.MapReduce.General ( RecGetFieldC(..)
, RCastC(..)
, IsoRec(..)
)
import Frames.Folds ( EndoFold
, FoldFieldEndo(..)
, monoidWrapperToFold
, MonoidalField
)
import qualified Control.Foldl as FL
import qualified Data.Profunctor as P
import qualified Data.Vinyl as V
import Data.Vinyl ( ElField )
import qualified Data.Vinyl.TypeLevel as V
import qualified Data.Vinyl.Functor as V
import qualified Frames as F
import Frames ( (:.) )
import qualified Frames.Melt as F
fieldFold
:: (Functor f, V.KnownField t)
=> EndoFold (f (V.Snd t))
-> EndoFold ((f :. ElField) t)
fieldFold :: forall (f :: * -> *) (t :: (Symbol, *)).
(Functor f, KnownField t) =>
EndoFold (f (Snd t)) -> EndoFold ((:.) f ElField t)
fieldFold =
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 (\(V.Field Snd t
x) -> Snd t
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall l k (f :: l -> *) (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
V.getCompose) (forall l k (f :: l -> *) (g :: k -> l) (x :: k).
f (g x) -> Compose f g x
V.Compose forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (t :: (Symbol, *)). Snd t -> ElField t
V.Field)
{-# INLINABLE fieldFold #-}
newtype FoldEndo f t = FoldEndo { forall {k} {k1} (f :: k -> *) (t :: (k1, k)).
FoldEndo f t -> EndoFold (f (Snd t))
unFoldEndo :: EndoFold (f (V.Snd t)) }
newtype FoldRecord record f g rs a = FoldRecord { forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
FoldRecord record f g rs a -> Fold (record (f :. ElField) rs) (g a)
unFoldRecord :: FL.Fold (record (f :. ElField) rs) (g a) }
toFoldRecord
:: (a -> g b)
-> FL.Fold (record (f :. ElField) rs) a
-> FoldRecord record f g rs b
toFoldRecord :: forall {k} {k} a (g :: k -> *) (b :: k)
(record :: ((Symbol, *) -> *) -> k -> *) (f :: * -> *) (rs :: k).
(a -> g b)
-> Fold (record (f :. ElField) rs) a -> FoldRecord record f g rs b
toFoldRecord a -> g b
wrap = forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
Fold (record (f :. ElField) rs) (g a) -> FoldRecord record f g rs a
FoldRecord forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> g b
wrap
{-# INLINABLE toFoldRecord #-}
filteredFold :: (f a -> Maybe a) -> FL.Fold a b -> FL.Fold (f a) b
filteredFold :: forall (f :: * -> *) a b.
(f a -> Maybe a) -> Fold a b -> Fold (f a) b
filteredFold f a -> Maybe a
toMaybe (FL.Fold x -> a -> x
step x
begin x -> b
done) = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
FL.Fold x -> f a -> x
step' x
begin x -> b
done
where step' :: x -> f a -> x
step' x
x = forall b a. b -> (a -> b) -> Maybe a -> b
maybe x
x (x -> a -> x
step x
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> Maybe a
toMaybe
recFieldF
:: forall t rs a record f
. (V.KnownField t, Applicative f)
=> (forall x . f x -> Maybe x)
-> FL.Fold a (V.Snd t)
-> (record (f :. ElField) rs -> f a)
-> FoldRecord record f (f :. ElField) rs t
recFieldF :: forall {k} (t :: (Symbol, *)) (rs :: k) a
(record :: ((Symbol, *) -> *) -> k -> *) (f :: * -> *).
(KnownField t, Applicative f) =>
(forall x. f x -> Maybe x)
-> Fold a (Snd t)
-> (record (f :. ElField) rs -> f a)
-> FoldRecord record f (f :. ElField) rs t
recFieldF forall x. f x -> Maybe x
toMaybe Fold a (Snd t)
fld record (f :. ElField) rs -> f a
fromRecF = forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
Fold (record (f :. ElField) rs) (g a) -> FoldRecord record f g rs a
FoldRecord
forall a b. (a -> b) -> a -> b
$ forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap record (f :. ElField) rs -> f a
fromRecF (forall l k (f :: l -> *) (g :: k -> l) (x :: k).
f (g x) -> Compose f g x
V.Compose forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (Symbol, *)). Snd t -> ElField t
V.Field) (forall (f :: * -> *) a b.
(f a -> Maybe a) -> Fold a b -> Fold (f a) b
filteredFold forall x. f x -> Maybe x
toMaybe Fold a (Snd t)
fld)
{-# INLINABLE recFieldF #-}
fieldToFieldFold
:: forall x y rs record f
. ( V.KnownField x
, V.KnownField y
, F.ElemOf rs x
, RecGetFieldC x record f rs
, Applicative f
)
=> (forall z . f z -> Maybe z)
-> FL.Fold (V.Snd x) (V.Snd y)
-> FoldRecord record f (f :. ElField) rs y
fieldToFieldFold :: forall (x :: (Symbol, *)) (y :: (Symbol, *)) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(KnownField x, KnownField y, ElemOf rs x,
RecGetFieldC x record f rs, Applicative f) =>
(forall z. f z -> Maybe z)
-> Fold (Snd x) (Snd y) -> FoldRecord record f (f :. ElField) rs y
fieldToFieldFold forall z. f z -> Maybe z
toMaybe Fold (Snd x) (Snd y)
fld = forall {k} (t :: (Symbol, *)) (rs :: k) a
(record :: ((Symbol, *) -> *) -> k -> *) (f :: * -> *).
(KnownField t, Applicative f) =>
(forall x. f x -> Maybe x)
-> Fold a (Snd t)
-> (record (f :. ElField) rs -> f a)
-> FoldRecord record f (f :. ElField) rs t
recFieldF forall z. f z -> Maybe z
toMaybe Fold (Snd x) (Snd y)
fld (forall (t :: (Symbol, *))
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *)
(rs :: [(Symbol, *)]).
(RecGetFieldC t record f rs, KnownField t, Functor f,
ElemOf rs t) =>
record (f :. ElField) rs -> f (Snd t)
rgetFieldF @x)
{-# INLINABLE fieldToFieldFold #-}
expandFoldInRecord
:: forall rs as record f
. (RCastC as rs record f, V.RMap as)
=> V.Rec (FoldRecord record f (f :. ElField) as) as
-> V.Rec (FoldRecord record f (f :. ElField) rs) as
expandFoldInRecord :: forall (rs :: [(Symbol, *)]) (as :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RCastC as rs record f, RMap as) =>
Rec (FoldRecord record f (f :. ElField) as) as
-> Rec (FoldRecord record f (f :. ElField) rs) as
expandFoldInRecord = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
V.rmap (forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
Fold (record (f :. ElField) rs) (g a) -> FoldRecord record f g rs a
FoldRecord forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b r. (a -> b) -> Fold b r -> Fold a r
FL.premap forall {k} (rs :: k) (ss :: k)
(record :: ((Symbol, *) -> *) -> k -> *) (f :: * -> *).
RCastC rs ss record f =>
record (f :. ElField) ss -> record (f :. ElField) rs
rcastF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
FoldRecord record f g rs a -> Fold (record (f :. ElField) rs) (g a)
unFoldRecord)
{-# INLINABLE expandFoldInRecord #-}
class EndoFieldFoldsToRecordFolds rs record f where
endoFieldFoldsToRecordFolds :: F.Rec (FoldFieldEndo (f :. ElField)) rs -> F.Rec (FoldRecord record f (f :. ElField) rs) rs
instance EndoFieldFoldsToRecordFolds '[] record f where
endoFieldFoldsToRecordFolds :: Rec (FoldFieldEndo (f :. ElField)) '[]
-> Rec (FoldRecord record f (f :. ElField) '[]) '[]
endoFieldFoldsToRecordFolds Rec (FoldFieldEndo (f :. ElField)) '[]
_ = forall {u} (a :: u -> *). Rec a '[]
V.RNil
{-# INLINABLE endoFieldFoldsToRecordFolds #-}
instance (EndoFieldFoldsToRecordFolds rs record f
, RCastC rs (r ': rs) record f
, V.KnownField r
, RecGetFieldC r record f (r ': rs)
, V.RMap rs
) => EndoFieldFoldsToRecordFolds (r ': rs) record f where
endoFieldFoldsToRecordFolds :: Rec (FoldFieldEndo (f :. ElField)) (r : rs)
-> Rec (FoldRecord record f (f :. ElField) (r : rs)) (r : rs)
endoFieldFoldsToRecordFolds (FoldFieldEndo (f :. ElField) r
fe V.:& Rec (FoldFieldEndo (f :. ElField)) rs
fes) = forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
Fold (record (f :. ElField) rs) (g a) -> FoldRecord record f g rs a
FoldRecord (forall a b r. (a -> b) -> Fold b r -> Fold a r
FL.premap (forall (t :: (Symbol, *))
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *)
(rs :: [(Symbol, *)]).
(RecGetFieldC t record f rs, KnownField t, ElemOf rs t) =>
record (f :. ElField) rs -> (:.) f ElField t
rgetF @r) (forall {k} (f :: k -> *) (a :: k).
FoldFieldEndo f a -> EndoFold (f a)
unFoldFieldEndo FoldFieldEndo (f :. ElField) r
fe)) forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
V.:& forall (rs :: [(Symbol, *)]) (as :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RCastC as rs record f, RMap as) =>
Rec (FoldRecord record f (f :. ElField) as) as
-> Rec (FoldRecord record f (f :. ElField) rs) as
expandFoldInRecord @(r ': rs) (forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
EndoFieldFoldsToRecordFolds rs record f =>
Rec (FoldFieldEndo (f :. ElField)) rs
-> Rec (FoldRecord record f (f :. ElField) rs) rs
endoFieldFoldsToRecordFolds Rec (FoldFieldEndo (f :. ElField)) rs
fes)
{-# INLINABLE endoFieldFoldsToRecordFolds #-}
sequenceRecFold
:: forall as rs record f
. (IsoRec rs record f)
=> F.Rec (FoldRecord record f (f :. ElField) as) rs
-> FL.Fold (record (f :. ElField) as) (record (f :. ElField) rs)
sequenceRecFold :: forall (as :: [(Symbol, *)]) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
IsoRec rs record f =>
Rec (FoldRecord record f (f :. ElField) as) rs
-> Fold (record (f :. ElField) as) (record (f :. ElField) rs)
sequenceRecFold = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
IsoRec rs record f =>
Rec (f :. ElField) rs -> record (f :. ElField) rs
fromRec forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
Applicative h =>
(forall (x :: u). f x -> h (g x)) -> Rec f rs -> h (Rec g rs)
V.rtraverse forall {k} {k} (record :: ((Symbol, *) -> *) -> k -> *)
(f :: * -> *) (g :: k -> *) (rs :: k) (a :: k).
FoldRecord record f g rs a -> Fold (record (f :. ElField) rs) (g a)
unFoldRecord
{-# INLINABLE sequenceRecFold #-}
sequenceFieldEndoFolds
:: (EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f)
=> F.Rec (FoldFieldEndo (f :. ElField)) rs
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceFieldEndoFolds :: forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f) =>
Rec (FoldFieldEndo (f :. ElField)) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceFieldEndoFolds = forall (as :: [(Symbol, *)]) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
IsoRec rs record f =>
Rec (FoldRecord record f (f :. ElField) as) rs
-> Fold (record (f :. ElField) as) (record (f :. ElField) rs)
sequenceRecFold forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
EndoFieldFoldsToRecordFolds rs record f =>
Rec (FoldFieldEndo (f :. ElField)) rs
-> Rec (FoldRecord record f (f :. ElField) rs) rs
endoFieldFoldsToRecordFolds
{-# INLINABLE sequenceFieldEndoFolds #-}
liftFoldEndo
:: (V.KnownField t, Functor f)
=> FoldEndo f t
-> FoldFieldEndo (f :. ElField) t
liftFoldEndo :: forall (t :: (Symbol, *)) (f :: * -> *).
(KnownField t, Functor f) =>
FoldEndo f t -> FoldFieldEndo (f :. ElField) t
liftFoldEndo = forall {k} (f :: k -> *) (a :: k).
EndoFold (f a) -> FoldFieldEndo f a
FoldFieldEndo forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) (t :: (Symbol, *)).
(Functor f, KnownField t) =>
EndoFold (f (Snd t)) -> EndoFold ((:.) f ElField t)
fieldFold forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} {k1} (f :: k -> *) (t :: (k1, k)).
FoldEndo f t -> EndoFold (f (Snd t))
unFoldEndo
{-# INLINABLE liftFoldEndo #-}
liftFolds
:: (V.RPureConstrained V.KnownField rs, V.RApply rs, Functor f)
=> F.Rec (FoldEndo f) rs
-> F.Rec (FoldFieldEndo (f :. ElField)) rs
liftFolds :: forall (rs :: [(Symbol, *)]) (f :: * -> *).
(RPureConstrained KnownField rs, RApply rs, Functor f) =>
Rec (FoldEndo f) rs -> Rec (FoldFieldEndo (f :. ElField)) rs
liftFolds = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
V.rapply Rec (Lift (->) (FoldEndo f) (FoldFieldEndo (f :. ElField))) rs
liftedFs
where liftedFs :: Rec (Lift (->) (FoldEndo f) (FoldFieldEndo (f :. ElField))) rs
liftedFs = forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
V.rpureConstrained @V.KnownField forall a b. (a -> b) -> a -> b
$ forall l l' k (op :: l -> l' -> *) (f :: k -> l) (g :: k -> l')
(x :: k).
op (f x) (g x) -> Lift op f g x
V.Lift forall (t :: (Symbol, *)) (f :: * -> *).
(KnownField t, Functor f) =>
FoldEndo f t -> FoldFieldEndo (f :. ElField) t
liftFoldEndo
{-# INLINABLE liftFolds #-}
sequenceEndoFolds
:: forall rs record f
. ( V.RApply rs
, V.RPureConstrained V.KnownField rs
, EndoFieldFoldsToRecordFolds rs record f
, IsoRec rs record f
, Functor f
)
=> F.Rec (FoldEndo f) rs
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceEndoFolds :: forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RApply rs, RPureConstrained KnownField rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Functor f) =>
Rec (FoldEndo f) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceEndoFolds = forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f) =>
Rec (FoldFieldEndo (f :. ElField)) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceFieldEndoFolds forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rs :: [(Symbol, *)]) (f :: * -> *).
(RPureConstrained KnownField rs, RApply rs, Functor f) =>
Rec (FoldEndo f) rs -> Rec (FoldFieldEndo (f :. ElField)) rs
liftFolds
{-# INLINABLE sequenceEndoFolds #-}
foldAll
:: ( V.RPureConstrained V.KnownField rs
, V.RApply rs
, EndoFieldFoldsToRecordFolds rs record f
, IsoRec rs record f
, Functor f
)
=> (forall a . FL.Fold a a)
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAll :: forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RPureConstrained KnownField rs, RApply rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Functor f) =>
(forall a. Fold a a)
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAll forall a. Fold a a
f = forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RApply rs, RPureConstrained KnownField rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Functor f) =>
Rec (FoldEndo f) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceEndoFolds forall a b. (a -> b) -> a -> b
$ forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
V.rpureConstrained @V.KnownField (forall {k} {k1} (f :: k -> *) (t :: (k1, k)).
EndoFold (f (Snd t)) -> FoldEndo f t
FoldEndo forall a. Fold a a
f)
{-# INLINABLE foldAll #-}
class (c (V.Snd t)) => ConstrainedField c t
instance (c (V.Snd t)) => ConstrainedField c t
foldAllConstrained
:: forall c rs record f
. ( V.RPureConstrained (ConstrainedField c) rs
, V.RPureConstrained V.KnownField rs
, V.RApply rs
, EndoFieldFoldsToRecordFolds rs record f
, IsoRec rs record f
, Applicative f
)
=> (forall a . f a -> Maybe a)
-> (forall a . c a => FL.Fold a a)
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAllConstrained :: forall (c :: * -> Constraint) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RPureConstrained (ConstrainedField c) rs,
RPureConstrained KnownField rs, RApply rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Applicative f) =>
(forall a. f a -> Maybe a)
-> (forall a. c a => Fold a a)
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAllConstrained forall a. f a -> Maybe a
toMaybe forall a. c a => Fold a a
f =
forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RApply rs, RPureConstrained KnownField rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Functor f) =>
Rec (FoldEndo f) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceEndoFolds forall a b. (a -> b) -> a -> b
$ forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
V.rpureConstrained @(ConstrainedField c)
(forall {k} {k1} (f :: k -> *) (t :: (k1, k)).
EndoFold (f (Snd t)) -> FoldEndo f t
FoldEndo (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b.
(f a -> Maybe a) -> Fold a b -> Fold (f a) b
filteredFold forall a. f a -> Maybe a
toMaybe forall a. c a => Fold a a
f))
{-# INLINABLE foldAllConstrained #-}
functorFoldAllConstrained
:: forall c rs record f
. ( V.RPureConstrained (ConstrainedField c) rs
, V.RPureConstrained V.KnownField rs
, V.RApply rs
, EndoFieldFoldsToRecordFolds rs record f
, IsoRec rs record f
, Applicative f
)
=> (forall a . c a => FL.Fold (f a) (f a))
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
functorFoldAllConstrained :: forall (c :: * -> Constraint) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RPureConstrained (ConstrainedField c) rs,
RPureConstrained KnownField rs, RApply rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Applicative f) =>
(forall a. c a => Fold (f a) (f a))
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
functorFoldAllConstrained forall a. c a => Fold (f a) (f a)
f =
forall (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RApply rs, RPureConstrained KnownField rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Functor f) =>
Rec (FoldEndo f) rs
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
sequenceEndoFolds forall a b. (a -> b) -> a -> b
$ forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
V.rpureConstrained @(ConstrainedField c) (forall {k} {k1} (f :: k -> *) (t :: (k1, k)).
EndoFold (f (Snd t)) -> FoldEndo f t
FoldEndo forall a. c a => Fold (f a) (f a)
f)
{-# INLINABLE functorFoldAllConstrained #-}
foldAllMonoid
:: forall g rs record f
. ( V.RPureConstrained (ConstrainedField (MonoidalField g)) rs
, V.RPureConstrained V.KnownField rs
, V.RApply rs
, EndoFieldFoldsToRecordFolds rs record f
, IsoRec rs record f
, Applicative f
)
=> (forall a . f a -> Maybe a)
-> FL.Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAllMonoid :: forall (g :: * -> *) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RPureConstrained (ConstrainedField (MonoidalField g)) rs,
RPureConstrained KnownField rs, RApply rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Applicative f) =>
(forall a. f a -> Maybe a)
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAllMonoid forall a. f a -> Maybe a
toMaybe =
forall (c :: * -> Constraint) (rs :: [(Symbol, *)])
(record :: ((Symbol, *) -> *) -> [(Symbol, *)] -> *) (f :: * -> *).
(RPureConstrained (ConstrainedField c) rs,
RPureConstrained KnownField rs, RApply rs,
EndoFieldFoldsToRecordFolds rs record f, IsoRec rs record f,
Applicative f) =>
(forall a. f a -> Maybe a)
-> (forall a. c a => Fold a a)
-> Fold (record (f :. ElField) rs) (record (f :. ElField) rs)
foldAllConstrained @(MonoidalField g) forall a. f a -> Maybe a
toMaybe forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. (Newtype (f a) a, Monoid (f a)) => Fold a a
monoidWrapperToFold @g
{-# INLINABLE foldAllMonoid #-}