Frames-map-reduce-0.4.1.1: Frames wrapper for map-reduce-folds and some extra folds helpers.
Copyright(c) Adam Conner-Sax 2019
LicenseBSD
Maintaineradam_conner_sax@yahoo.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Frames.Folds.General

Description

Frames.Folds contains various helper functions designed to simplify folding over Frames/Vinyl records given some way of folding over each column.

Synopsis

Types

type EndoFold a = Fold a a Source #

A Type synonym for folds like sum or, often, average.

Types to act as "interpretation functors" for records of folds

newtype FoldEndo f t Source #

Wrapper for Endo-folds of the field types of ElFields

Constructors

FoldEndo 

Fields

newtype FoldRecord record f g rs a Source #

Wrapper for folds from a record to an interpreted field. Usually g ~ ElField

Constructors

FoldRecord 

Fields

classes

class EndoFieldFoldsToRecordFolds rs record f Source #

Change a record of single field folds to a record of folds from the entire record to each field

Minimal complete definition

endoFieldFoldsToRecordFolds

Instances

Instances details
EndoFieldFoldsToRecordFolds ('[] :: [(Symbol, Type)]) record f Source # 
Instance details

Defined in Frames.Folds.General

Methods

endoFieldFoldsToRecordFolds :: Rec (FoldFieldEndo (f :. ElField)) '[] -> Rec (FoldRecord record f (f :. ElField) '[]) '[]

(EndoFieldFoldsToRecordFolds rs record f, RCastC rs (r ': rs) record f, KnownField r, RecGetFieldC r record f (r ': rs), RMap rs) => EndoFieldFoldsToRecordFolds (r ': rs) record f Source # 
Instance details

Defined in Frames.Folds.General

Methods

endoFieldFoldsToRecordFolds :: Rec (FoldFieldEndo (f :. ElField)) (r ': rs) -> Rec (FoldRecord record f (f :. ElField) (r ': rs)) (r ': rs)

class c (Snd t) => ConstrainedField c t Source #

Instances

Instances details
c (Snd t) => ConstrainedField (c :: k -> Constraint) (t :: (k1, k)) Source # 
Instance details

Defined in Frames.Folds.General

functions for building records of folds

toFoldRecord :: (a -> g b) -> Fold (record (f :. ElField) rs) a -> FoldRecord record f g rs b Source #

Create a FoldRecord from a Fold from a record to a specific type. This is helpful when creating folds from a record to another record (or the same record) by building it one field at a time. See examples for details.

recFieldF Source #

Arguments

:: forall t rs a record f. (KnownField t, Applicative f) 
=> (forall x. f x -> Maybe x) 
-> Fold a (Snd t)

A fold from some type a to the field type of an ElField

-> (record (f :. ElField) rs -> f a) 
-> FoldRecord record f (f :. ElField) rs t

the resulting FoldRecord-wrapped fold

Helper for building a FoldRecord from a given fold and function of the record

fieldToFieldFold Source #

Arguments

:: forall x y rs record 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)

the fold to be wrapped

-> FoldRecord record f (f :. ElField) rs y

the wrapped fold

special case of recFieldF for the case when the function from the record to the folded type is just retrieving the value in a field.

functions for turning records of folds into folds of records

sequenceRecFold :: forall as rs record f. IsoRec rs record f => Rec (FoldRecord record f (f :. ElField) as) rs -> Fold (record (f :. ElField) as) (record (f :. ElField) rs) Source #

Turn a Record of folds into a fold over records

sequenceEndoFolds :: forall rs record 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) Source #

turn a record of endo-folds over each field, into a fold over records

functions using constraints to extend an endo-fold across a record

foldAll :: (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) Source #

apply an unconstrained endo-fold, e.g., a fold which takes the last item in a container, to every field in a record

foldAllConstrained :: forall c rs record 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) Source #

Apply a constrained endo-fold to all fields of a record. May require a use of TypeApplications, e.g., foldAllConstrained @Num FL.sum

functorFoldAllConstrained :: forall c rs record 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) Source #

foldAllMonoid :: forall g rs record 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) Source #

Given a monoid-wrapper, e.g., Sum, apply the derived endo-fold to all fields of a record This is strictly less powerful than foldAllConstrained but might be simpler to use in some cases