generic-data-functions-0.3.0: Familiar functions lifted to generic data types
Safe HaskellSafe-Inferred
LanguageGHC2021

Generic.Data.Function.Traverse

Description

traverse for generic data types.

TODO This is harder to conceptualize than generic foldMap. No nice clean explanation yet.

This function can provide generic support for simple parser-esque types.

Synopsis

Documentation

class GenericTraverse tag where Source #

Implementation enumeration type class for generic traverse.

The type variable is uninstantiated, used purely as a tag.

Avoid orphan instances by defining custom empty types to use here. See the binrep library on Hackage for an example.

Associated Types

type GenericTraverseF tag :: Type -> Type Source #

The target Applicative to traverse to.

type GenericTraverseC tag a :: Constraint Source #

The type class providing the action in traverse for permitted types.

Methods

genericTraverseAction Source #

Arguments

:: GenericTraverseC tag a 
=> String

data type name

-> String

constructor name

-> Maybe String

record name (if present)

-> Natural

field index

-> GenericTraverseF tag a 

The action in traverse (first argument).

We include data type metadata because this function is useful for monadic parsers, which can record it in error messages. (We don't do it for foldMap because it's pure.)

Instances

Instances details
GenericTraverse (EmptyRec0 f :: Type) Source #

traverse over types where all fields are replaced with the functor's empty.

Note that one may write a valid instance using a Monoid on as instead. I don't think you should. But I can't explain why.

Instance details

Defined in Generic.Data.Function.Traverse.Constructor

Associated Types

type GenericTraverseF (EmptyRec0 f) :: Type -> Type Source #

type GenericTraverseC (EmptyRec0 f) a Source #

GenericTraverse (NoRec0 f :: Type) Source #

traverse over types with no fields in any constructor.

Instance details

Defined in Generic.Data.Function.Traverse.Constructor

Associated Types

type GenericTraverseF (NoRec0 f) :: Type -> Type Source #

type GenericTraverseC (NoRec0 f) a Source #

genericTraverseNonSum :: forall {cd} {gf} asserts tag a. (Generic a, Rep a ~ D1 cd gf, GTraverseNonSum cd tag gf, ApplyGCAsserts asserts tag, Functor (GenericTraverseF tag)) => GenericTraverseF tag a Source #

Generic traverse over a term of non-sum data type f a.

class GTraverseNonSum (cd :: Meta) tag gf Source #

Minimal complete definition

gTraverseNonSum

Instances

Instances details
GTraverseNonSum cd (tag :: k1) (V1 :: k2 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.NonSum

Methods

gTraverseNonSum :: forall (p :: k10). GenericTraverseF tag (V1 p) Source #

GTraverseNonSum cd (tag :: k1) (l :+: r :: k2 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.NonSum

Methods

gTraverseNonSum :: forall (p :: k10). GenericTraverseF tag ((l :+: r) p) Source #

(Functor (GenericTraverseF tag), GTraverseC cd cc 0 tag gf) => GTraverseNonSum cd (tag :: k1) (C1 cc gf :: k2 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.NonSum

Methods

gTraverseNonSum :: forall (p :: k10). GenericTraverseF tag (C1 cc gf p) Source #

class GenericTraverse tag => GenericTraverseSum tag where Source #

Sum type monads that can be generically traversed.

We use Alternative to handle "which constructor" checking on the term level.

Methods

genericTraverseSumPfxTagAction Source #

Arguments

:: GenericTraverseC tag pt 
=> String

data type name

-> GenericTraverseF tag pt 

Try to parse a prefix tag of type pt.

Relevant metadata is provided as arguments.

genericTraverseSumNoMatchingCstrAction Source #

Arguments

:: String

data type name

-> [String]

non-matching constructor names

-> Text

prefix tag, prettified

-> GenericTraverseF tag a 

Parse error due to no constructor matching the parsed prefix tag.

Relevant metadata is provided as arguments.

data PfxTagCfg a Source #

How to use a type as a prefix tag in a generic sum type parser.

Constructors

PfxTagCfg 

Fields

  • pfxTagCfgFromCstr :: String -> a

    How to turn a constructor name into a prefix tag.

  • pfxTagCfgEq :: a -> a -> Bool

    How to compare prefix tags for equality.

    By shoving this into our generic derivation config, we can avoid adding an insidious Eq constraint. In general, you will want to set this to (==).

  • pfxTagCfgShow :: a -> Text

    Make a prefix tag human-readable. show is often appropriate.

genericTraverseSum :: forall {cd} {gf} opts asserts tag a pt. (Generic a, Rep a ~ D1 cd gf, GTraverseSum opts cd tag gf, ApplyGCAsserts asserts tag, GenericTraverseC tag pt, Functor (GenericTraverseF tag)) => PfxTagCfg pt -> GenericTraverseF tag a Source #

Generic traverse over a term of sum data type f a.

You must provide a configuration for how to handle constructors.

class GTraverseSum (opts :: SumOpts) cd tag gf Source #

Minimal complete definition

gTraverseSum

Instances

Instances details
GTraverseSum opts (cd :: k1) (tag :: k2) (V1 :: k3 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.Sum

Methods

gTraverseSum :: forall pt (p :: k20). GenericTraverseC tag pt => PfxTagCfg pt -> GenericTraverseF tag (V1 p) Source #

GTraverseSum 'SumOnly (cd :: k1) (tag :: k2) (C1 cc gf :: k3 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.Sum

Methods

gTraverseSum :: forall pt (p :: k20). GenericTraverseC tag pt => PfxTagCfg pt -> GenericTraverseF tag (C1 cc gf p) Source #

(GenericTraverseSum tag, GTraverseCSum cd tag (C1 cc gf), Datatype cd, Alternative (GenericTraverseF tag), Monad (GenericTraverseF tag)) => GTraverseSum 'AllowSingletonSum (cd :: k2) (tag :: k1) (C1 cc gf :: k3 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.Sum

Methods

gTraverseSum :: forall pt (p :: k20). GenericTraverseC tag pt => PfxTagCfg pt -> GenericTraverseF tag (C1 cc gf p) Source #

(GenericTraverseSum tag, GTraverseCSum cd tag (l :+: r), Datatype cd, Alternative (GenericTraverseF tag), Monad (GenericTraverseF tag)) => GTraverseSum opts (cd :: k2) (tag :: k1) (l :+: r :: k3 -> Type) Source # 
Instance details

Defined in Generic.Data.Function.Traverse.Sum

Methods

gTraverseSum :: forall pt (p :: k20). GenericTraverseC tag pt => PfxTagCfg pt -> GenericTraverseF tag ((l :+: r) p) Source #

eqShowPfxTagCfg :: (Eq a, Show a) => (String -> a) -> PfxTagCfg a Source #

Construct a prefix tag config using existing Eq and Show instances.

The user only needs to provide the constructor name parser.