Copyright | (c) Adam Conner-Sax 2019 |
---|---|
License | BSD |
Maintainer | adam_conner_sax@yahoo.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Frames.Folds contains various helper functions designed to simplify folding over Frames/Vinyl records given some way of folding over each column.
Synopsis
- type EndoFold a = Fold a a
- newtype FoldEndo f t = FoldEndo {
- unFoldEndo :: EndoFold (f (Snd t))
- newtype FoldRecord record f g rs a = FoldRecord {
- unFoldRecord :: Fold (record (f :. ElField) rs) (g a)
- toFoldRecord :: (a -> g b) -> Fold (record (Maybe :. ElField) rs) a -> FoldRecord record Maybe g rs b
- recFieldF :: forall t rs a record. KnownField t => Fold a (Snd t) -> (record (Maybe :. ElField) rs -> Maybe a) -> FoldRecord record Maybe (Maybe :. ElField) rs t
- fieldToFieldFold :: forall x y rs record. (KnownField x, KnownField y, ElemOf rs x, RecGetFieldC x record Maybe rs) => Fold (Snd x) (Snd y) -> FoldRecord record Maybe (Maybe :. ElField) rs y
- sequenceRecFold :: forall as rs record. IsoRec rs record Maybe => Rec (FoldRecord record Maybe (Maybe :. ElField) as) rs -> Fold (record (Maybe :. ElField) as) (record (Maybe :. ElField) rs)
- sequenceEndoFolds :: forall rs record. (RApply rs, RPureConstrained KnownField rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => Rec (FoldEndo Maybe) rs -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs)
- foldAll :: (RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => (forall a. Fold a a) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs)
- foldAllConstrained :: forall c rs record. (RPureConstrained (ConstrainedField c) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => (forall a. c a => Fold a a) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs)
- maybeFoldAllConstrained :: forall c rs record. (RPureConstrained (ConstrainedField c) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => (forall a. c a => Fold (Maybe a) (Maybe a)) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs)
- foldAllMonoid :: forall g rs record. (RPureConstrained (ConstrainedField (MonoidalField g)) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs)
Types
Types to act as "interpretation functors" for records of folds
Wrapper for Endo-folds of the field types of ElFields
FoldEndo | |
|
newtype FoldRecord record f g rs a Source #
Wrapper for folds from a record to an interpreted field. Usually g ~ ElField
FoldRecord | |
|
functions for building records of folds
toFoldRecord :: (a -> g b) -> Fold (record (Maybe :. ElField) rs) a -> FoldRecord record Maybe 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.
:: KnownField t | |
=> Fold a (Snd t) | A fold from some type a to the field type of an ElField |
-> (record (Maybe :. ElField) rs -> Maybe a) | a function to get the a value from the input record |
-> FoldRecord record Maybe (Maybe :. ElField) rs t | the resulting |
Helper for building a FoldRecord
from a given fold and function of the record
:: (KnownField x, KnownField y, ElemOf rs x, RecGetFieldC x record Maybe rs) | |
=> Fold (Snd x) (Snd y) | the fold to be wrapped |
-> FoldRecord record Maybe (Maybe :. 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. IsoRec rs record Maybe => Rec (FoldRecord record Maybe (Maybe :. ElField) as) rs -> Fold (record (Maybe :. ElField) as) (record (Maybe :. ElField) rs) Source #
Turn a Record of folds into a fold over records
sequenceEndoFolds :: forall rs record. (RApply rs, RPureConstrained KnownField rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => Rec (FoldEndo Maybe) rs -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. 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 Maybe, IsoRec rs record Maybe) => (forall a. Fold a a) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. 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. (RPureConstrained (ConstrainedField c) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => (forall a. c a => Fold a a) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. 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
maybeFoldAllConstrained :: forall c rs record. (RPureConstrained (ConstrainedField c) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => (forall a. c a => Fold (Maybe a) (Maybe a)) -> Fold (record (Maybe :. ElField) rs) (record (Maybe :. ElField) rs) Source #
foldAllMonoid :: forall g rs record. (RPureConstrained (ConstrainedField (MonoidalField g)) rs, RPureConstrained KnownField rs, RApply rs, EndoFieldFoldsToRecordFolds rs record Maybe, IsoRec rs record Maybe) => Fold (record (Maybe :. ElField) rs) (record (Maybe :. 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