generic-data-functions 0.5.1 → 0.6.0
raw patch · 20 files changed
+456/−192 lines, 20 filesdep −textdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies removed: text
Dependency ranges changed: base
API changes (from Hackage documentation)
- Generic.Data.Function.Common.TypeNats: natVal'' :: forall n. KnownNat n => Natural
- Generic.Data.Function.Common.TypeNats: natValInt :: forall n. KnownNat n => Int
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1) (c :: GHC.Generics.Meta) (gf :: k2 -> GHC.Types.Type). (GHC.Base.Semigroup (Generic.Data.Function.FoldMap.Constructor.GenericFoldMapM tag), GHC.Generics.Constructor c, Generic.Data.Function.FoldMap.Constructor.GFoldMapC tag gf) => Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag (GHC.Generics.C1 c gf)
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1) (c :: GHC.Generics.Meta) (gf :: k2 -> GHC.Types.Type). Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag (GHC.Generics.C1 c gf) => Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag (GHC.Generics.C1 c gf)
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1) (gf :: k2 -> GHC.Types.Type) (c :: GHC.Generics.Meta). Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag gf => Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag (GHC.Generics.D1 c gf)
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1) (l :: k2 -> GHC.Types.Type) (r :: k2 -> GHC.Types.Type). (Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag l, Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag r) => Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag (l GHC.Generics.:+: r)
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1) (l :: k2 -> GHC.Types.Type) (r :: k2 -> GHC.Types.Type). Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag (l GHC.Generics.:+: r) => Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag (l GHC.Generics.:+: r)
- Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 (tag :: k1). Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag GHC.Generics.V1
- Generic.Data.Function.Traverse: PfxTagCfg :: (String -> a) -> (a -> a -> Bool) -> (a -> Text) -> PfxTagCfg a
- Generic.Data.Function.Traverse: [pfxTagCfgEq] :: PfxTagCfg a -> a -> a -> Bool
- Generic.Data.Function.Traverse: [pfxTagCfgFromCstr] :: PfxTagCfg a -> String -> a
- Generic.Data.Function.Traverse: [pfxTagCfgShow] :: PfxTagCfg a -> a -> Text
- Generic.Data.Function.Traverse: class GenericTraverse tag => GenericTraverseSum tag
- Generic.Data.Function.Traverse: data PfxTagCfg a
- Generic.Data.Function.Traverse: eqShowPfxTagCfg :: (Eq a, Show a) => (String -> a) -> PfxTagCfg a
- Generic.Data.Function.Traverse: genericTraverseSumNoMatchingCstrAction :: GenericTraverseSum tag => String -> [String] -> Text -> GenericTraverseF tag a
- Generic.Data.Function.Traverse: genericTraverseSumPfxTagAction :: (GenericTraverseSum tag, GenericTraverseC tag pt) => String -> GenericTraverseF tag pt
- Generic.Data.Function.Traverse.Constructor: instance forall k1 k2 k3 (tag :: k1) (cd :: k2) (cc :: k3) (si :: GHC.Num.Natural.Natural) (l :: GHC.Types.Type -> GHC.Types.Type) (r :: GHC.Types.Type -> GHC.Types.Type). (GHC.Base.Applicative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si l, Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc (si GHC.TypeNats.+ Generic.Data.Function.Traverse.Constructor.ProdArity r) r) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si (l GHC.Generics.:*: r)
- Generic.Data.Function.Traverse.Constructor: instance forall k1 k2 k3 k4 (tag :: k1) (cd :: k2) (cc :: k3). GHC.Base.Applicative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc 0 GHC.Generics.U1
- Generic.Data.Function.Traverse.Constructor: instance forall k1 k2 k3 k4 (tag :: k1) a (si :: GHC.TypeNats.Nat) (cs :: GHC.Generics.Meta) (cc :: k2) (cd :: k3). (Generic.Data.Function.Traverse.Constructor.GenericTraverse tag, Generic.Data.Function.Traverse.Constructor.GenericTraverseC tag a, GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), GHC.TypeNats.KnownNat si, GHC.Generics.Selector cs, GHC.Generics.Constructor cc, GHC.Generics.Datatype cd) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si (GHC.Generics.S1 cs (GHC.Generics.Rec0 a))
- Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Generics.Meta) (cc :: GHC.Generics.Meta) (gf :: k2 -> GHC.Types.Type). (GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc 0 gf) => Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd (GHC.Generics.C1 cc gf)
- Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Generics.Meta) (gf :: k2 -> GHC.Types.Type). (GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd gf) => Generic.Data.Function.Traverse.NonSum.GTraverseNonSum tag (GHC.Generics.D1 cd gf)
- Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Generics.Meta) (l :: k2 -> GHC.Types.Type) (r :: k2 -> GHC.Types.Type). Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd (l GHC.Generics.:+: r)
- Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Generics.Meta). Generic.Data.Function.Traverse.Constructor.GenericTraverse tag => Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd GHC.Generics.V1
- Generic.Data.Function.Traverse.Sum: PfxTagCfg :: (String -> a) -> (a -> a -> Bool) -> (a -> Text) -> PfxTagCfg a
- Generic.Data.Function.Traverse.Sum: [pfxTagCfgEq] :: PfxTagCfg a -> a -> a -> Bool
- Generic.Data.Function.Traverse.Sum: [pfxTagCfgFromCstr] :: PfxTagCfg a -> String -> a
- Generic.Data.Function.Traverse.Sum: [pfxTagCfgShow] :: PfxTagCfg a -> a -> Text
- Generic.Data.Function.Traverse.Sum: class GenericTraverse tag => GenericTraverseSum tag
- Generic.Data.Function.Traverse.Sum: data PfxTagCfg a
- Generic.Data.Function.Traverse.Sum: genericTraverseSumNoMatchingCstrAction :: GenericTraverseSum tag => String -> [String] -> Text -> GenericTraverseF tag a
- Generic.Data.Function.Traverse.Sum: genericTraverseSumPfxTagAction :: (GenericTraverseSum tag, GenericTraverseC tag pt) => String -> GenericTraverseF tag pt
- Generic.Data.Function.Traverse.Sum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Generics.Meta) (gf :: k2 -> GHC.Types.Type). (GHC.Base.Alternative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), GHC.Base.Monad (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Sum.GenericTraverseSum tag, Generic.Data.Function.Traverse.Sum.GTraverseCSum tag cd gf, GHC.Generics.Datatype cd, Generic.Data.Function.Common.Generic.Meta.KnownSymbols (Generic.Data.Function.Common.Generic.Meta.CstrNames gf)) => Generic.Data.Function.Traverse.Sum.GTraverseSum tag (GHC.Generics.D1 cd gf)
- Generic.Data.Function.Traverse.Sum: instance forall k1 k2 (tag :: k1). Generic.Data.Function.Traverse.Constructor.GenericTraverse tag => Generic.Data.Function.Traverse.Sum.GTraverseSum tag GHC.Generics.V1
- Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (tag :: k1) (cd :: k2) (cc :: GHC.Generics.Meta) (gf :: k3 -> GHC.Types.Type). (GHC.Base.Alternative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc 0 gf, GHC.Generics.Constructor cc) => Generic.Data.Function.Traverse.Sum.GTraverseCSum tag cd (GHC.Generics.C1 cc gf)
- Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (tag :: k1) (cd :: k2) (l :: k3 -> GHC.Types.Type) (r :: k3 -> GHC.Types.Type). (GHC.Base.Alternative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Sum.GTraverseCSum tag cd l, Generic.Data.Function.Traverse.Sum.GTraverseCSum tag cd r) => Generic.Data.Function.Traverse.Sum.GTraverseCSum tag cd (l GHC.Generics.:+: r)
+ Generic.Data.FOnCstr: -- constructor name).
+ Generic.Data.FOnCstr: -- | Constraint. Includes relevant generic meta (data type &
+ Generic.Data.FOnCstr: class GFOnCstr tag (name :: Symbol) gf
+ Generic.Data.FOnCstr: class GFOnCstr' tag (dtName :: Symbol) (cstrName :: Symbol) (turns :: [GCstrChoice]) gf
+ Generic.Data.FOnCstr: class GenericFOnCstr tag where {
+ Generic.Data.FOnCstr: gFOnCstr :: GFOnCstr tag name gf => GenericFOnCstrF tag (gf p)
+ Generic.Data.FOnCstr: gFOnCstr' :: GFOnCstr' tag dtName cstrName turns gf => GenericFOnCstrF tag (gf p)
+ Generic.Data.FOnCstr: genericFOnCstr :: forall tag (name :: Symbol) a. (Generic a, Functor (GenericFOnCstrF tag), GFOnCstr tag name (Rep a)) => GenericFOnCstrF tag a
+ Generic.Data.FOnCstr: genericFOnCstrF :: (GenericFOnCstr tag, GenericFOnCstrC tag dtName cstrName gf) => Proxy# '(dtName, cstrName) -> GenericFOnCstrF tag (gf p)
+ Generic.Data.FOnCstr: instance forall k1 k2 (tag :: k1) (dtName :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (gf :: k2 -> GHC.Types.Type) (mc :: GHC.Generics.Meta). (GHC.Base.Functor (Generic.Data.FOnCstr.GenericFOnCstrF tag), Generic.Data.FOnCstr.GenericFOnCstr tag, Generic.Data.FOnCstr.GenericFOnCstrC tag dtName cstrName gf) => Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName '[] (GHC.Generics.C1 mc gf)
+ Generic.Data.FOnCstr: instance forall k1 k2 (tag :: k1) (dtName :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (turns :: [Generic.Type.CstrPath.GCstrChoice]) (l :: k2 -> GHC.Types.Type) (r :: k2 -> GHC.Types.Type). (GHC.Base.Functor (Generic.Data.FOnCstr.GenericFOnCstrF tag), Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName turns l) => Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName ('Generic.Type.CstrPath.GoL1 : turns) (l GHC.Generics.:+: r)
+ Generic.Data.FOnCstr: instance forall k1 k2 (tag :: k1) (dtName :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (turns :: [Generic.Type.CstrPath.GCstrChoice]) (r :: k2 -> GHC.Types.Type) (l :: k2 -> GHC.Types.Type). (GHC.Base.Functor (Generic.Data.FOnCstr.GenericFOnCstrF tag), Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName turns r) => Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName ('Generic.Type.CstrPath.GoR1 : turns) (l GHC.Generics.:+: r)
+ Generic.Data.FOnCstr: instance forall k1 k2 (turns :: [Generic.Type.CstrPath.GCstrChoice]) (dtName :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (gf :: k1 -> GHC.Types.Type) (tag :: k2) (_md2 :: GHC.Types.Symbol) (_md3 :: GHC.Types.Symbol) (_md4 :: GHC.Types.Bool). (turns GHC.Types.~ Generic.Data.FOnCstr.AssertValidCstrPath dtName cstrName (Generic.Type.CstrPath.GCstrPath cstrName gf), GHC.Base.Functor (Generic.Data.FOnCstr.GenericFOnCstrF tag), Generic.Data.FOnCstr.GFOnCstr' tag dtName cstrName turns gf) => Generic.Data.FOnCstr.GFOnCstr tag cstrName (GHC.Generics.D1 ('GHC.Generics.MetaData dtName _md2 _md3 _md4) gf)
+ Generic.Data.FOnCstr: type GenericFOnCstrC tag (dtName :: Symbol) (cstrName :: Symbol) (gf :: k -> Type) :: Constraint;
+ Generic.Data.FOnCstr: type GenericFOnCstrF tag :: Type -> Type;
+ Generic.Data.FOnCstr: type family AssertValidCstrPath dtName cstr eae
+ Generic.Data.FOnCstr: }
+ Generic.Data.Function.Common.TypeLits: natVal'' :: forall n. KnownNat n => Natural
+ Generic.Data.Function.Common.TypeLits: natValInt :: forall n. KnownNat n => Int
+ Generic.Data.Function.Common.TypeLits: symbolVal'' :: forall sym. KnownSymbol sym => String
+ Generic.Data.Function.FoldMap: genericFoldMapSumRaw :: forall tag a. (Generic a, GFoldMapSum tag Raw (Rep a)) => (String -> GenericFoldMapM tag) -> a -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap.Sum: class GFoldMapSumD tag sumtag dtName gf
+ Generic.Data.Function.FoldMap.Sum: gFoldMapSumD :: GFoldMapSumD tag sumtag dtName gf => ParseCstrTo sumtag (GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 (tag :: k1) (gf :: k2 -> GHC.Types.Type) (sumtag :: k3) (cstrParsed :: Generic.Data.MetaParse.Cstr.CstrParseResult sumtag) (dtName :: GHC.Types.Symbol) (cstr :: GHC.Types.Symbol) (_mc2 :: GHC.Generics.FixityI) (_mc3 :: GHC.Types.Bool). (GHC.Base.Semigroup (Generic.Data.Function.FoldMap.Constructor.GenericFoldMapM tag), Generic.Data.Function.FoldMap.Constructor.GFoldMapC tag gf, Generic.Data.MetaParse.Cstr.ReifyCstrParseResult sumtag cstrParsed, Generic.Data.MetaParse.Cstr.ForceGCParse dtName cstr (Generic.Data.MetaParse.Cstr.ParseCstr sumtag cstr) GHC.Types.~ cstrParsed) => Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName (GHC.Generics.C1 ('GHC.Generics.MetaCons cstr _mc2 _mc3) gf)
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2) (dtName :: GHC.Types.Symbol) (c :: GHC.Generics.Meta) (gf :: k3 -> GHC.Types.Type). Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName (GHC.Generics.C1 c gf) => Generic.Data.Function.FoldMap.Sum.GFoldMapSumD tag sumtag dtName (GHC.Generics.C1 c gf)
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2) (dtName :: GHC.Types.Symbol) (gf :: k3 -> GHC.Types.Type) (_md2 :: GHC.Types.Symbol) (_md3 :: GHC.Types.Symbol) (_md4 :: GHC.Types.Bool). Generic.Data.Function.FoldMap.Sum.GFoldMapSumD tag sumtag dtName gf => Generic.Data.Function.FoldMap.Sum.GFoldMapSum tag sumtag (GHC.Generics.D1 ('GHC.Generics.MetaData dtName _md2 _md3 _md4) gf)
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2) (dtName :: GHC.Types.Symbol) (l :: k3 -> GHC.Types.Type) (r :: k3 -> GHC.Types.Type). (Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName l, Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName r) => Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName (l GHC.Generics.:+: r)
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2) (dtName :: GHC.Types.Symbol) (l :: k3 -> GHC.Types.Type) (r :: k3 -> GHC.Types.Type). Generic.Data.Function.FoldMap.Sum.GFoldMapCSum tag sumtag dtName (l GHC.Generics.:+: r) => Generic.Data.Function.FoldMap.Sum.GFoldMapSumD tag sumtag dtName (l GHC.Generics.:+: r)
+ Generic.Data.Function.FoldMap.Sum: instance forall k1 k2 k3 k4 (tag :: k1) (sumtag :: k2) (dtName :: k3). Generic.Data.Function.FoldMap.Sum.GFoldMapSumD tag sumtag dtName GHC.Generics.V1
+ Generic.Data.Function.Traverse: genericTraverseSumRaw :: forall tag a pt. (Generic a, Functor (GenericTraverseF tag), GTraverseSum tag Raw (Rep a)) => (String -> pt) -> (String -> GenericTraverseF tag pt) -> (forall x. String -> GenericTraverseF tag x) -> (pt -> pt -> Bool) -> GenericTraverseF tag a
+ Generic.Data.Function.Traverse.Constructor: class ReifyMaybeSymbol (mstr :: Maybe Symbol)
+ Generic.Data.Function.Traverse.Constructor: instance GHC.TypeLits.KnownSymbol str => Generic.Data.Function.Traverse.Constructor.ReifyMaybeSymbol ('GHC.Maybe.Just str)
+ Generic.Data.Function.Traverse.Constructor: instance Generic.Data.Function.Traverse.Constructor.ReifyMaybeSymbol 'GHC.Maybe.Nothing
+ Generic.Data.Function.Traverse.Constructor: instance forall k (tag :: k) (cd :: GHC.Types.Symbol) (cc :: GHC.Types.Symbol) (si :: GHC.Num.Natural.Natural) (l :: GHC.Types.Type -> GHC.Types.Type) (r :: GHC.Types.Type -> GHC.Types.Type). (GHC.Base.Applicative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si l, Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc (si GHC.TypeNats.+ Generic.Data.Function.Traverse.Constructor.ProdArity r) r) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si (l GHC.Generics.:*: r)
+ Generic.Data.Function.Traverse.Constructor: instance forall k1 k2 (tag :: k1) (cd :: GHC.Types.Symbol) (cc :: GHC.Types.Symbol). GHC.Base.Applicative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc 0 GHC.Generics.U1
+ Generic.Data.Function.Traverse.Constructor: instance forall k1 k2 (tag :: k1) a (si :: GHC.TypeNats.Nat) (mSelName :: GHC.Maybe.Maybe GHC.Types.Symbol) (cc :: GHC.Types.Symbol) (cd :: GHC.Types.Symbol) (_ms2 :: GHC.Generics.SourceUnpackedness) (_ms3 :: GHC.Generics.SourceStrictness) (_ms4 :: GHC.Generics.DecidedStrictness). (Generic.Data.Function.Traverse.Constructor.GenericTraverse tag, Generic.Data.Function.Traverse.Constructor.GenericTraverseC tag a, GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), GHC.TypeNats.KnownNat si, Generic.Data.Function.Traverse.Constructor.ReifyMaybeSymbol mSelName, GHC.TypeLits.KnownSymbol cc, GHC.TypeLits.KnownSymbol cd) => Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cc si (GHC.Generics.S1 ('GHC.Generics.MetaSel mSelName _ms2 _ms3 _ms4) (GHC.Generics.Rec0 a))
+ Generic.Data.Function.Traverse.Constructor: reifyMaybeSymbol :: ReifyMaybeSymbol mstr => Maybe String
+ Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (gf :: k2 -> GHC.Types.Type) (_mc2 :: GHC.Generics.FixityI) (_mc3 :: GHC.Types.Bool). (GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag cd cstrName 0 gf) => Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd (GHC.Generics.C1 ('GHC.Generics.MetaCons cstrName _mc2 _mc3) gf)
+ Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Types.Symbol) (l :: k2 -> GHC.Types.Type) (r :: k2 -> GHC.Types.Type). Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd (l GHC.Generics.:+: r)
+ Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (cd :: GHC.Types.Symbol). Generic.Data.Function.Traverse.Constructor.GenericTraverse tag => Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag cd GHC.Generics.V1
+ Generic.Data.Function.Traverse.NonSum: instance forall k1 k2 (tag :: k1) (dtName :: GHC.Types.Symbol) (gf :: k2 -> GHC.Types.Type) (_md2 :: GHC.Types.Symbol) (_md3 :: GHC.Types.Symbol) (_md4 :: GHC.Types.Bool). (GHC.Base.Functor (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.NonSum.GTraverseNonSumD tag dtName gf) => Generic.Data.Function.Traverse.NonSum.GTraverseNonSum tag (GHC.Generics.D1 ('GHC.Generics.MetaData dtName _md2 _md3 _md4) gf)
+ Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (f :: GHC.Types.Type -> GHC.Types.Type) (tag :: k1) (dtName :: GHC.Types.Symbol) (sumtag :: k2) (gf :: k3 -> GHC.Types.Type) (_md2 :: GHC.Types.Symbol) (_md3 :: GHC.Types.Symbol) (_md4 :: GHC.Types.Bool). (f GHC.Types.~ Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag, GHC.Base.Alternative f, GHC.Base.Monad f, GHC.TypeLits.KnownSymbol dtName, Generic.Data.Function.Traverse.Sum.GTraverseCSum tag sumtag dtName gf) => Generic.Data.Function.Traverse.Sum.GTraverseSum tag sumtag (GHC.Generics.D1 ('GHC.Generics.MetaData dtName _md2 _md3 _md4) gf)
+ Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (tag :: k1) (dtName :: GHC.Types.Symbol) (cstrName :: GHC.Types.Symbol) (gf :: k2 -> GHC.Types.Type) (sumtag :: k3) (cstrParsed :: Generic.Data.MetaParse.Cstr.CstrParseResult sumtag) (cstr :: GHC.Types.Symbol) (_mc2 :: GHC.Generics.FixityI) (_mc3 :: GHC.Types.Bool). (GHC.Base.Alternative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Constructor.GTraverseC tag dtName cstrName 0 gf, Generic.Data.MetaParse.Cstr.ReifyCstrParseResult sumtag cstrParsed, Generic.Data.MetaParse.Cstr.ForceGCParse dtName cstr (Generic.Data.MetaParse.Cstr.ParseCstr sumtag cstrName) GHC.Types.~ cstrParsed) => Generic.Data.Function.Traverse.Sum.GTraverseCSum tag sumtag dtName (GHC.Generics.C1 ('GHC.Generics.MetaCons cstrName _mc2 _mc3) gf)
+ Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2) (dtName :: GHC.Types.Symbol) (l :: k3 -> GHC.Types.Type) (r :: k3 -> GHC.Types.Type). (GHC.Base.Alternative (Generic.Data.Function.Traverse.Constructor.GenericTraverseF tag), Generic.Data.Function.Traverse.Sum.GTraverseCSum tag sumtag dtName l, Generic.Data.Function.Traverse.Sum.GTraverseCSum tag sumtag dtName r) => Generic.Data.Function.Traverse.Sum.GTraverseCSum tag sumtag dtName (l GHC.Generics.:+: r)
+ Generic.Data.Function.Traverse.Sum: instance forall k1 k2 k3 (tag :: k1) (sumtag :: k2). Generic.Data.Function.Traverse.Constructor.GenericTraverse tag => Generic.Data.Function.Traverse.Sum.GTraverseSum tag sumtag GHC.Generics.V1
+ Generic.Data.MetaParse.Cstr: --
+ Generic.Data.MetaParse.Cstr: -- <a>Generic.Data.Cstr.Parser.Symparsec</a> for handy definitions.
+ Generic.Data.MetaParse.Cstr: -- <tt>(KnownSymbol a, KnownSymbol b)</tt>.
+ Generic.Data.MetaParse.Cstr: -- For example, you might reify <tt>'(a, b) :: (Symbol, Symbol)</tt> with
+ Generic.Data.MetaParse.Cstr: -- The Symparsec library generates type families that look like this. See
+ Generic.Data.MetaParse.Cstr: -- name.
+ Generic.Data.MetaParse.Cstr: -- | Result kind of the constructor name parser.
+ Generic.Data.MetaParse.Cstr: class CstrParser' tag => CstrParser tag where {
+ Generic.Data.MetaParse.Cstr: class CstrParser' tag where {
+ Generic.Data.MetaParse.Cstr: data Raw
+ Generic.Data.MetaParse.Cstr: instance Generic.Data.MetaParse.Cstr.CstrParser Generic.Data.MetaParse.Internal.Raw
+ Generic.Data.MetaParse.Cstr: instance Generic.Data.MetaParse.Cstr.CstrParser' Generic.Data.MetaParse.Internal.Raw
+ Generic.Data.MetaParse.Cstr: type CstrParseResult tag :: k;
+ Generic.Data.MetaParse.Cstr: type ParseCstr tag (str :: Symbol) :: Either ErrorMessage (CstrParseResult tag);
+ Generic.Data.MetaParse.Cstr: type ParseCstrTo tag r = forall (x :: CstrParseResult tag). ReifyCstrParseResult tag x => Proxy# x -> r
+ Generic.Data.MetaParse.Cstr: type ReifyCstrParseResult tag (x :: CstrParseResult tag) :: Constraint;
+ Generic.Data.MetaParse.Cstr: type family ForceGCParse dtName cstr a
+ Generic.Data.MetaParse.Cstr: }
+ Generic.Data.MetaParse.Internal: data Raw
+ Generic.Type.CstrPath: GoL1 :: GCstrChoice
+ Generic.Type.CstrPath: GoR1 :: GCstrChoice
+ Generic.Type.CstrPath: data GCstrChoice
+ Generic.Type.CstrPath: type family GCstrPath name gf
- Generic.Data.Function.Example: showGeneric :: forall a. (Generic a, GFoldMapSum Showly (Rep a)) => a -> String
+ Generic.Data.Function.Example: showGeneric :: forall a. (Generic a, GFoldMapSum Showly Raw (Rep a)) => a -> String
- Generic.Data.Function.FoldMap: class GFoldMapSum tag gf
+ Generic.Data.Function.FoldMap: class GFoldMapSum tag sumtag gf
- Generic.Data.Function.FoldMap: genericFoldMapNonSum :: forall {k} (tag :: k) a. (Generic a, GFoldMapNonSum tag (Rep a)) => a -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap: genericFoldMapNonSum :: forall tag a. (Generic a, GFoldMapNonSum tag (Rep a)) => a -> GenericFoldMapM tag
- Generic.Data.Function.FoldMap: genericFoldMapSum :: forall {k} (tag :: k) a. (Generic a, GFoldMapSum tag (Rep a)) => (String -> GenericFoldMapM tag) -> a -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap: genericFoldMapSum :: forall tag sumtag a. (Generic a, GFoldMapSum tag sumtag (Rep a)) => ParseCstrTo sumtag (GenericFoldMapM tag) -> a -> GenericFoldMapM tag
- Generic.Data.Function.FoldMap.Sum: class GFoldMapCSum tag gf
+ Generic.Data.Function.FoldMap.Sum: class GFoldMapCSum tag sumtag (dtName :: Symbol) gf
- Generic.Data.Function.FoldMap.Sum: class GFoldMapSum tag gf
+ Generic.Data.Function.FoldMap.Sum: class GFoldMapSum tag sumtag gf
- Generic.Data.Function.FoldMap.Sum: gFoldMapCSum :: GFoldMapCSum tag gf => (String -> GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap.Sum: gFoldMapCSum :: GFoldMapCSum tag sumtag dtName gf => ParseCstrTo sumtag (GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag
- Generic.Data.Function.FoldMap.Sum: gFoldMapSum :: GFoldMapSum tag gf => (String -> GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag
+ Generic.Data.Function.FoldMap.Sum: gFoldMapSum :: GFoldMapSum tag sumtag gf => ParseCstrTo sumtag (GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag
- Generic.Data.Function.Traverse: class GTraverseSum tag gf
+ Generic.Data.Function.Traverse: class GTraverseSum tag sumtag gf
- Generic.Data.Function.Traverse: genericTraverseSum :: forall {k} (tag :: k) a pt. (Generic a, Functor (GenericTraverseF tag), GTraverseSum tag (Rep a), GenericTraverseC tag pt) => PfxTagCfg pt -> GenericTraverseF tag a
+ Generic.Data.Function.Traverse: genericTraverseSum :: forall tag sumtag a pt. (Generic a, Functor (GenericTraverseF tag), GTraverseSum tag sumtag (Rep a)) => ParseCstrTo sumtag pt -> (String -> GenericTraverseF tag pt) -> (forall x. String -> GenericTraverseF tag x) -> (pt -> pt -> Bool) -> GenericTraverseF tag a
- Generic.Data.Function.Traverse.Constructor: class GTraverseC tag cd cc (si :: Natural) gf
+ Generic.Data.Function.Traverse.Constructor: class GTraverseC tag (cd :: Symbol) (cc :: Symbol) (si :: Natural) gf
- Generic.Data.Function.Traverse.NonSum: class GTraverseNonSumD tag (cd :: Meta) gf
+ Generic.Data.Function.Traverse.NonSum: class GTraverseNonSumD tag (cd :: Symbol) gf
- Generic.Data.Function.Traverse.Sum: class GTraverseCSum tag cd gf
+ Generic.Data.Function.Traverse.Sum: class GTraverseCSum tag sumtag (dtName :: Symbol) gf
- Generic.Data.Function.Traverse.Sum: class GTraverseSum tag gf
+ Generic.Data.Function.Traverse.Sum: class GTraverseSum tag sumtag gf
- Generic.Data.Function.Traverse.Sum: gTraverseCSum :: GTraverseCSum tag cd gf => PfxTagCfg pt -> pt -> GenericTraverseF tag (gf p)
+ Generic.Data.Function.Traverse.Sum: gTraverseCSum :: GTraverseCSum tag sumtag dtName gf => ParseCstrTo sumtag pt -> (pt -> pt -> Bool) -> pt -> GenericTraverseF tag (gf p)
- Generic.Data.Function.Traverse.Sum: gTraverseSum :: (GTraverseSum tag gf, GenericTraverseC tag pt) => PfxTagCfg pt -> GenericTraverseF tag (gf p)
+ Generic.Data.Function.Traverse.Sum: gTraverseSum :: GTraverseSum tag sumtag gf => ParseCstrTo sumtag pt -> (String -> GenericTraverseF tag pt) -> (forall a. String -> GenericTraverseF tag a) -> (pt -> pt -> Bool) -> GenericTraverseF tag (gf p)
Files
- CHANGELOG.md +9/−0
- LICENSE +1/−1
- README.md +14/−2
- generic-data-functions.cabal +8/−5
- src/Generic/Data/FOnCstr.hs +96/−0
- src/Generic/Data/Function/Common/Generic/Meta.hs +1/−1
- src/Generic/Data/Function/Common/TypeLits.hs +21/−0
- src/Generic/Data/Function/Common/TypeNats.hs +0/−17
- src/Generic/Data/Function/Example.hs +3/−2
- src/Generic/Data/Function/FoldMap.hs +21/−9
- src/Generic/Data/Function/FoldMap/Sum.hs +40/−34
- src/Generic/Data/Function/FoldMap/SumConsByte.hs +1/−1
- src/Generic/Data/Function/Traverse.hs +24/−22
- src/Generic/Data/Function/Traverse/Constructor.hs +14/−12
- src/Generic/Data/Function/Traverse/NonSum.hs +8/−7
- src/Generic/Data/Function/Traverse/Sum.hs +56/−74
- src/Generic/Data/MetaParse/Cstr.hs +84/−0
- src/Generic/Data/MetaParse/Internal.hs +4/−0
- src/Generic/Data/Wrappers.hs +13/−5
- src/Generic/Type/CstrPath.hs +38/−0
CHANGELOG.md view
@@ -1,3 +1,12 @@+## 0.6.0 (2024-06-15)+* support parsing constructor names on type-level for `foldMap`, `traverse`+ * effectively requires Symparsec-- but we need not incur a dependency+ * previous behaviour is still present using `*Raw` functions+* add `FOnCstr`, for targeting a single constructor of a sum type+* bump minimum compiler to GHC 9.2 (base-4.16) because I can't easily test GHC+ 9.0+* big cleanup+ ## 0.5.1 (2024-04-10) * remove spurious constraint in Traverse.Sum (should be same semantics) * bump text upper bound for GHC 9.8 compatibility
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2023 Ben Orchard (@raehik) <thefirstmuffinman@gmail.com>+Copyright (c) 2023-2024 Ben Orchard (@raehik) <thefirstmuffinman@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
README.md view
@@ -8,10 +8,16 @@ these as "reusable" or "generic" generics. Most relevant for simple parsing and printing/serializing/reducing tasks where-the only "work" to do for the given data type is mechanical field sequencing.-If you require more logic than that (and can't place it in types/newtypes), you+the only "work" to do for the given data type is mechanical field sequencing. If+you require more logic than that (and can't place it in types/newtypes), you will not be able to use this library. +Emphasis is put on type safety and performance. Notably, for sum type generics,+we permit parsing constructor names on the type level (via+[symparsec](https://hackage.haskell.org/package/symparsec)). For cases where you+want to implement your own high-performance sum type handling, we provide+`Generic.Data.FOnCstr`.+ ## Rationale There are a number of competing parsing and serialization Haskell libraries. Most have a type class for enumerating permitted types, and some simple generics@@ -24,6 +30,12 @@ copy-paste my generics and swap the type classes. Very silly. But it turned out my generics were otherwise highly general, so I spun them out into this library. Now you can swap the type class just by filling in some holes.++## Design notes+### Sum types are handled by prepending a sum tag+Unless otherwise specified, this is how we disambiguate constructors. How the+sum tag is parsed from a constructor is up to the user (and may be done on the+type-level if one wishes). ## Functions ### `foldMap` (L->R)
generic-data-functions.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: generic-data-functions-version: 0.5.1+version: 0.6.0 synopsis: Familiar functions lifted to generic data types description: Please see README.md. category: Data, Generics@@ -26,11 +26,12 @@ library exposed-modules:+ Generic.Data.FOnCstr Generic.Data.Function Generic.Data.Function.Common.Error Generic.Data.Function.Common.Generic Generic.Data.Function.Common.Generic.Meta- Generic.Data.Function.Common.TypeNats+ Generic.Data.Function.Common.TypeLits Generic.Data.Function.Contra Generic.Data.Function.Contra.Constructor Generic.Data.Function.Contra.NonSum@@ -45,7 +46,10 @@ Generic.Data.Function.Traverse.Constructor Generic.Data.Function.Traverse.NonSum Generic.Data.Function.Traverse.Sum+ Generic.Data.MetaParse.Cstr+ Generic.Data.MetaParse.Internal Generic.Data.Wrappers+ Generic.Type.CstrPath other-modules: Paths_generic_data_functions hs-source-dirs:@@ -61,9 +65,8 @@ TypeFamilies DataKinds MagicHash- ghc-options: -Wall+ ghc-options: -Wall -Wno-unticked-promoted-constructors build-depends:- base >=4.14 && <5+ base >=4.16 && <5 , contravariant >=1.5.5 && <1.6- , text >=1.2.5.0 && <2.2 default-language: GHC2021
+ src/Generic/Data/FOnCstr.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE AllowAmbiguousTypes #-} -- for da test++module Generic.Data.FOnCstr where++import GHC.Generics+import GHC.TypeLits+import Data.Kind ( type Type, type Constraint )+import Generic.Type.CstrPath+import GHC.Exts ( Proxy#, proxy# )++-- | What generic functor to run on the requested constructor.+class GenericFOnCstr tag where+ -- | Functor.+ type GenericFOnCstrF tag :: Type -> Type++ -- | Constraint. Includes relevant generic meta (data type & constructor+ -- name).+ type GenericFOnCstrC tag (dtName :: Symbol) (cstrName :: Symbol) (gf :: k -> Type) :: Constraint++ -- | Generic functor.+ --+ -- We have to pass a proxy thanks to type applications not working properly+ -- with instances. (This will be easier in GHC 9.10 via+ -- RequiredTypeArguments).+ genericFOnCstrF+ :: GenericFOnCstrC tag dtName cstrName gf+ => Proxy# '(dtName, cstrName)+ -> GenericFOnCstrF tag (gf p)++-- | Run a generic functor (provided via @tag@) on the constructor name @name@.+--+-- We hope and pray that GHC removes the generic wrappers, at least the+-- constructor ones, since we do a whole bunch of nothing with them on the term+-- level. Checking this (the produced Core) is a big TODO.+class GFOnCstr tag (name :: Symbol) gf where+ gFOnCstr :: GenericFOnCstrF tag (gf p)++type family AssertValidCstrPath dtName cstr eae where+ AssertValidCstrPath dtName cstr (Right a) = a+ AssertValidCstrPath dtName cstr (Left e) = TypeError+ ( Text "error searching for constructor " :<>: Text cstr+ :<>: Text " in data type " :<>: Text dtName :<>: Text ":"+ :$$: e )++instance+ ( turns ~ AssertValidCstrPath dtName cstrName (GCstrPath cstrName gf)+ , Functor (GenericFOnCstrF tag)+ , GFOnCstr' tag dtName cstrName turns gf+ ) => GFOnCstr tag cstrName (D1 (MetaData dtName _md2 _md3 _md4) gf) where+ {-# INLINE gFOnCstr #-}+ gFOnCstr = M1 <$> gFOnCstr' @tag @dtName @cstrName @turns++class GFOnCstr' tag (dtName :: Symbol) (cstrName :: Symbol) (turns :: [GCstrChoice]) gf where+ gFOnCstr' :: GenericFOnCstrF tag (gf p)++{-+The following instances rely on @turns@ being valid for the current generic+representation. I don't attempt to handle this at all, because I assume my+constructor path algorithm is correct. Please let me know if you get an error+that says it came from this class.+-}+instance (Functor (GenericFOnCstrF tag), GFOnCstr' tag dtName cstrName turns l)+ => GFOnCstr' tag dtName cstrName (GoL1 : turns) (l :+: r) where+ {-# INLINE gFOnCstr' #-}+ gFOnCstr' = L1 <$> gFOnCstr' @tag @dtName @cstrName @turns+instance (Functor (GenericFOnCstrF tag), GFOnCstr' tag dtName cstrName turns r)+ => GFOnCstr' tag dtName cstrName (GoR1 : turns) (l :+: r) where+ {-# INLINE gFOnCstr' #-}+ gFOnCstr' = R1 <$> gFOnCstr' @tag @dtName @cstrName @turns+instance+ ( Functor (GenericFOnCstrF tag), GenericFOnCstr tag+ , GenericFOnCstrC tag dtName cstrName gf+ ) => GFOnCstr' tag dtName cstrName '[] (C1 mc gf) where+ {-# INLINE gFOnCstr' #-}+ gFOnCstr' =+ M1 <$> genericFOnCstrF @tag (proxy# :: Proxy# '(dtName, cstrName))++-- | Run a generic functor on the requested constructor of the given type.+genericFOnCstr+ :: forall tag (name :: Symbol) a+ . ( Generic a, Functor (GenericFOnCstrF tag), GFOnCstr tag name (Rep a) )+ => GenericFOnCstrF tag a+genericFOnCstr = to <$> gFOnCstr @tag @name++{-+This type errors due to a "could not deduce 'GFOnCstr GX name (Rep a)'", "The+type variable 'k0' is ambiguous". Unsure why. GHC seems to indicate that it's+making a whole bunch of unused k1-3 type vars... I feel like GHC is trying to+match instances too early, and somehow backs itself into a corner.+genericFOnCstr'+ :: forall (name :: Symbol) a+ . ( Generic a, GFOnCstr GX name (Rep a) )+ => Maybe a+genericFOnCstr' = to <$> gFOnCstr @GX @name+-}
src/Generic/Data/Function/Common/Generic/Meta.hs view
@@ -10,7 +10,7 @@ -- | List every constructor name in a generic type rep. type family CstrNames gf :: [Symbol] where CstrNames (l :+: r) = CstrNames l ++ CstrNames r- CstrNames (C1 ('MetaCons n _ _) _) = '[n]+ CstrNames (C1 (MetaCons n _ _) _) = '[n] -- | Append for type-level lists. type family (as :: [k]) ++ (bs :: [k]) :: [k] where
+ src/Generic/Data/Function/Common/TypeLits.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE AllowAmbiguousTypes #-}++-- | Handy typelit utils.++module Generic.Data.Function.Common.TypeLits where++import GHC.TypeNats ( Natural, KnownNat, natVal' )+import GHC.TypeLits ( KnownSymbol, symbolVal' )+import GHC.Exts ( proxy#, Proxy# )++natVal'' :: forall n. KnownNat n => Natural+natVal'' = natVal' (proxy# :: Proxy# n)+{-# INLINE natVal'' #-}++natValInt :: forall n. KnownNat n => Int+natValInt = fromIntegral $ natVal'' @n+{-# INLINE natValInt #-}++symbolVal'' :: forall sym. KnownSymbol sym => String+symbolVal'' = symbolVal' (proxy# :: Proxy# sym)+{-# INLINE symbolVal'' #-}
− src/Generic/Data/Function/Common/TypeNats.hs
@@ -1,17 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}---- | Handy typenat utils.--module Generic.Data.Function.Common.TypeNats where---- natVal''-import GHC.TypeNats ( Natural, KnownNat, natVal' )-import GHC.Exts ( proxy#, Proxy# )--natVal'' :: forall n. KnownNat n => Natural-natVal'' = natVal' (proxy# :: Proxy# n)-{-# INLINE natVal'' #-}--natValInt :: forall n. KnownNat n => Int-natValInt = fromIntegral $ natVal'' @n-{-# INLINE natValInt #-}
src/Generic/Data/Function/Example.hs view
@@ -4,6 +4,7 @@ import GHC.Generics import Generic.Data.Function.FoldMap+import Generic.Data.MetaParse.Cstr import Data.List qualified as List @@ -22,11 +23,11 @@ showGeneric :: forall a- . (Generic a, GFoldMapSum Showly (Rep a))+ . (Generic a, GFoldMapSum Showly Raw (Rep a)) => a -> String showGeneric = mconcat . List.intersperse " "- . genericFoldMapSum @Showly (\cstr -> [cstr])+ . genericFoldMapSumRaw @Showly (\cstr -> [cstr]) showGeneric' :: forall a
src/Generic/Data/Function/FoldMap.hs view
@@ -31,6 +31,7 @@ ( GenericFoldMap(..) , genericFoldMapNonSum, GFoldMapNonSum , genericFoldMapSum, GFoldMapSum+ , genericFoldMapSumRaw , genericFoldMapSumConsByte, GFoldMapSumConsByte ) where @@ -42,27 +43,38 @@ import Generic.Data.Function.FoldMap.SumConsByte import Data.Word ( Word8 ) +import Generic.Data.MetaParse.Cstr+import GHC.TypeLits ( symbolVal' )+ -- | Generic 'foldMap' over a term of non-sum data type @a@. -- -- @a@ must have exactly one constructor. genericFoldMapNonSum- :: forall {k} (tag :: k) a+ :: forall tag a . ( Generic a, GFoldMapNonSum tag (Rep a) ) => a -> GenericFoldMapM tag genericFoldMapNonSum = gFoldMapNonSum @tag . from -- | Generic 'foldMap' over a term of sum data type @a@. ----- You must provide a function for mapping constructor names to monoidal values.------ This is the most generic option, but depending on your string manipulation--- may be slower.+-- You must provide a type tag for parsing constructor names on the type-level,+-- and a function for reifying such results to monoidal values. genericFoldMapSum- :: forall {k} (tag :: k) a- . ( Generic a, GFoldMapSum tag (Rep a)- ) => (String -> GenericFoldMapM tag)+ :: forall tag sumtag a+ . (Generic a, GFoldMapSum tag sumtag (Rep a))+ => ParseCstrTo sumtag (GenericFoldMapM tag) -> a -> GenericFoldMapM tag-genericFoldMapSum f = gFoldMapSum @tag f . from+genericFoldMapSum f = gFoldMapSum @tag @sumtag f . from++-- | Generic 'foldMap' over a term of sum data type @a@.+--+-- You must provide a function for mapping constructor names to monoidal values.+genericFoldMapSumRaw+ :: forall tag a+ . (Generic a, GFoldMapSum tag Raw (Rep a))+ => (String -> GenericFoldMapM tag)+ -> a -> GenericFoldMapM tag+genericFoldMapSumRaw f = gFoldMapSum @tag @Raw (\p -> f (symbolVal' p)) . from -- | Generic 'foldMap' over a term of sum data type @a@ where constructors are -- mapped to their index (distance from first/leftmost constructor)
src/Generic/Data/Function/FoldMap/Sum.hs view
@@ -1,51 +1,57 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE UndecidableInstances #-} -- required below GHC 9.6--{- | 'foldMap' for sum types where constructors are encoded by mapping the- constructor name.--Note that constructor names are unique per type. So as long as your mapping-function similarly outputs unique values of your monoid for each constructor,-you should be able to "reverse" the process (e.g. for generic 'traverse').--}+{-# LANGUAGE UndecidableInstances #-} -- due to type families in constraints+{-# LANGUAGE AllowAmbiguousTypes #-} -- due to class design module Generic.Data.Function.FoldMap.Sum where import GHC.Generics-import Generic.Data.Function.Common.Generic ( conName', absurdV1 )+import Generic.Data.Function.Common.Generic ( absurdV1 ) import Generic.Data.Function.FoldMap.Constructor ( GFoldMapC(gFoldMapC) , GenericFoldMap(type GenericFoldMapM) )+import Generic.Data.MetaParse.Cstr+import GHC.Exts ( proxy# )+import GHC.TypeLits ( Symbol ) -class GFoldMapSum tag gf where+class GFoldMapSum tag sumtag gf where gFoldMapSum- :: (String -> GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag+ :: ParseCstrTo sumtag (GenericFoldMapM tag)+ -> gf p -> GenericFoldMapM tag -instance GFoldMapSum tag gf => GFoldMapSum tag (D1 c gf) where- gFoldMapSum f = gFoldMapSum @tag f . unM1+instance GFoldMapSumD tag sumtag dtName gf+ => GFoldMapSum tag sumtag (D1 (MetaData dtName _md2 _md3 _md4) gf) where+ gFoldMapSum f = gFoldMapSumD @tag @sumtag @dtName f . unM1 -instance GFoldMapCSum tag (l :+: r) => GFoldMapSum tag (l :+: r) where- gFoldMapSum = gFoldMapCSum @tag+class GFoldMapSumD tag sumtag dtName gf where+ gFoldMapSumD+ :: ParseCstrTo sumtag (GenericFoldMapM tag)+ -> gf p -> GenericFoldMapM tag -instance GFoldMapCSum tag (C1 c gf) => GFoldMapSum tag (C1 c gf) where- gFoldMapSum = gFoldMapCSum @tag+instance GFoldMapSumD tag sumtag dtName V1 where+ gFoldMapSumD _ = absurdV1 -instance GFoldMapSum tag V1 where- gFoldMapSum _ = absurdV1+instance GFoldMapCSum tag sumtag dtName (C1 c gf)+ => GFoldMapSumD tag sumtag dtName (C1 c gf) where+ gFoldMapSumD = gFoldMapCSum @tag @sumtag @dtName --- | Sum type handler prefixing constructor contents with their mapped--- constructor name via a provided @String -> m@.------ TODO rename-class GFoldMapCSum tag gf where+instance GFoldMapCSum tag sumtag dtName (l :+: r)+ => GFoldMapSumD tag sumtag dtName (l :+: r) where+ gFoldMapSumD = gFoldMapCSum @tag @sumtag @dtName++class GFoldMapCSum tag sumtag (dtName :: Symbol) gf where gFoldMapCSum- :: (String -> GenericFoldMapM tag) -> gf p -> GenericFoldMapM tag+ :: ParseCstrTo sumtag (GenericFoldMapM tag)+ -> gf p -> GenericFoldMapM tag -instance (GFoldMapCSum tag l, GFoldMapCSum tag r)- => GFoldMapCSum tag (l :+: r) where- gFoldMapCSum f = \case L1 l -> gFoldMapCSum @tag f l- R1 r -> gFoldMapCSum @tag f r+instance (GFoldMapCSum tag sumtag dtName l, GFoldMapCSum tag sumtag dtName r)+ => GFoldMapCSum tag sumtag dtName (l :+: r) where+ gFoldMapCSum f = \case L1 l -> gFoldMapCSum @tag @sumtag @dtName f l+ R1 r -> gFoldMapCSum @tag @sumtag @dtName f r -instance (Semigroup (GenericFoldMapM tag), Constructor c, GFoldMapC tag gf)- => GFoldMapCSum tag (C1 c gf) where- gFoldMapCSum mapCstr (M1 a) = mapCstr (conName' @c) <> gFoldMapC @tag a+-- TODO could play with this. Perhaps Unsatisfiable (GHC 9.8) is better?+instance+ ( Semigroup (GenericFoldMapM tag), GFoldMapC tag gf+ , ReifyCstrParseResult sumtag cstrParsed+ , ForceGCParse dtName cstr (ParseCstr sumtag cstr) ~ cstrParsed+ ) => GFoldMapCSum tag sumtag dtName (C1 (MetaCons cstr _mc2 _mc3) gf) where+ gFoldMapCSum mapReifyCstr (M1 a) =+ mapReifyCstr (proxy# @cstrParsed) <> gFoldMapC @tag a
src/Generic/Data/Function/FoldMap/SumConsByte.hs view
@@ -14,7 +14,7 @@ import GHC.Generics import GHC.TypeLits import Data.Kind ( Type, Constraint )-import Generic.Data.Function.Common.TypeNats ( natVal'' )+import Generic.Data.Function.Common.TypeLits ( natVal'' ) import Generic.Data.Function.FoldMap.Constructor ( GFoldMapC(gFoldMapC) , GenericFoldMap(type GenericFoldMapM) )
src/Generic/Data/Function/Traverse.hs view
@@ -11,9 +11,8 @@ module Generic.Data.Function.Traverse ( GenericTraverse(..) , genericTraverseNonSum , GTraverseNonSum- , GenericTraverseSum(..), PfxTagCfg(..) , genericTraverseSum, GTraverseSum- , eqShowPfxTagCfg+ , genericTraverseSumRaw ) where import GHC.Generics@@ -21,8 +20,8 @@ import Generic.Data.Function.Traverse.NonSum import Generic.Data.Function.Traverse.Sum import Generic.Data.Function.Traverse.Constructor--import Data.Text qualified as Text+import Generic.Data.MetaParse.Cstr+import GHC.TypeLits ( symbolVal' ) -- | Generic 'traverse' over a term of non-sum data type @f a@, -- where @f@ is set by the @tag@ you pass.@@ -34,25 +33,28 @@ ) => GenericTraverseF tag a genericTraverseNonSum = to <$> gTraverseNonSum @tag --- | Generic 'traverse' over a term of sum data type @f a@,--- where @f@ is set by the @tag@ you pass.------ You must provide a configuration for how to handle constructors. genericTraverseSum- :: forall {k} (tag :: k) a pt+ :: forall tag sumtag a pt . ( Generic a , Functor (GenericTraverseF tag)- , GTraverseSum tag (Rep a)- , GenericTraverseC tag pt- ) => PfxTagCfg pt -> GenericTraverseF tag a-genericTraverseSum ptc = to <$> gTraverseSum @tag ptc+ , GTraverseSum tag sumtag (Rep a)+ ) => ParseCstrTo sumtag pt+ -> (String -> GenericTraverseF tag pt)+ -> (forall x. String -> GenericTraverseF tag x)+ -> (pt -> pt -> Bool)+ -> GenericTraverseF tag a+genericTraverseSum parseCstr ptGet fNoMatch ptEq =+ to <$> gTraverseSum @tag @sumtag parseCstr ptGet fNoMatch ptEq --- | Construct a prefix tag config using existing 'Eq' and 'Show' instances.------ The user only needs to provide the constructor name parser.-eqShowPfxTagCfg :: (Eq a, Show a) => (String -> a) -> PfxTagCfg a-eqShowPfxTagCfg f = PfxTagCfg- { pfxTagCfgFromCstr = f- , pfxTagCfgEq = (==)- , pfxTagCfgShow = Text.pack . show- }+genericTraverseSumRaw+ :: forall tag a pt+ . ( Generic a+ , Functor (GenericTraverseF tag)+ , GTraverseSum tag Raw (Rep a)+ ) => (String -> pt)+ -> (String -> GenericTraverseF tag pt)+ -> (forall x. String -> GenericTraverseF tag x)+ -> (pt -> pt -> Bool)+ -> GenericTraverseF tag a+genericTraverseSumRaw parseCstr ptGet fNoMatch ptEq = to <$>+ gTraverseSum @tag @Raw (\p -> parseCstr (symbolVal' p)) ptGet fNoMatch ptEq
src/Generic/Data/Function/Traverse/Constructor.hs view
@@ -4,9 +4,8 @@ module Generic.Data.Function.Traverse.Constructor where import GHC.Generics-import GHC.TypeNats ( Natural, KnownNat, type (+) )-import Generic.Data.Function.Common.Generic ( datatypeName', conName', selName'' )-import Generic.Data.Function.Common.TypeNats ( natVal'' )+import GHC.TypeLits+import Generic.Data.Function.Common.TypeLits ( natVal'', symbolVal'' ) import Generic.Data.Function.Common.Error ( eNoEmpty ) import Control.Applicative qualified as Applicative@@ -15,10 +14,7 @@ import Data.Kind ( type Type, type Constraint ) import Generic.Data.Wrappers ( NoRec0, type ENoRec0, EmptyRec0 )-import GHC.TypeError ( TypeError, ErrorMessage(..) ) --- import Data.Monoid- -- | Implementation enumeration type class for generic 'traverse'. -- -- The type variable is uninstantiated, used purely as a tag.@@ -81,7 +77,7 @@ type GenericTraverseC (EmptyRec0 f) _ = Alternative f genericTraverseAction _ _ _ _ = empty -class GTraverseC tag cd cc (si :: Natural) gf where+class GTraverseC tag (cd :: Symbol) (cc :: Symbol) (si :: Natural) gf where gTraverseC :: GenericTraverseF tag (gf p) instance@@ -96,13 +92,13 @@ instance ( GenericTraverse tag, GenericTraverseC tag a , Functor (GenericTraverseF tag)- , KnownNat si, Selector cs, Constructor cc, Datatype cd- ) => GTraverseC tag cd cc si (S1 cs (Rec0 a)) where+ , KnownNat si, ReifyMaybeSymbol mSelName, KnownSymbol cc, KnownSymbol cd+ ) => GTraverseC tag cd cc si (S1 (MetaSel mSelName _ms2 _ms3 _ms4) (Rec0 a)) where gTraverseC = (M1 . K1) <$> genericTraverseAction @tag cd cc cs si where- cs = selName'' @cs- cd = datatypeName' @cd- cc = conName' @cc+ cs = reifyMaybeSymbol @mSelName+ cd = symbolVal'' @cd+ cc = symbolVal'' @cc si = natVal'' @si instance Applicative (GenericTraverseF tag) => GTraverseC tag cd cc 0 U1 where@@ -111,3 +107,9 @@ type family ProdArity (f :: Type -> Type) :: Natural where ProdArity (S1 c f) = 1 ProdArity (l :*: r) = ProdArity l + ProdArity r++class ReifyMaybeSymbol (mstr :: Maybe Symbol) where+ reifyMaybeSymbol :: Maybe String+instance ReifyMaybeSymbol Nothing where reifyMaybeSymbol = Nothing+instance KnownSymbol str => ReifyMaybeSymbol (Just str) where+ reifyMaybeSymbol = Just (symbolVal'' @str)
src/Generic/Data/Function/Traverse/NonSum.hs view
@@ -4,22 +4,23 @@ module Generic.Data.Function.Traverse.NonSum where import GHC.Generics+import GHC.TypeLits ( Symbol ) import Generic.Data.Function.Traverse.Constructor import Generic.Data.Function.Common.Error class GTraverseNonSum tag gf where gTraverseNonSum :: GenericTraverseF tag (gf p) -instance (Functor (GenericTraverseF tag), GTraverseNonSumD tag cd gf)- => GTraverseNonSum tag (D1 cd gf) where- gTraverseNonSum = M1 <$> gTraverseNonSumD @tag @cd+instance (Functor (GenericTraverseF tag), GTraverseNonSumD tag dtName gf)+ => GTraverseNonSum tag (D1 (MetaData dtName _md2 _md3 _md4) gf) where+ gTraverseNonSum = M1 <$> gTraverseNonSumD @tag @dtName -class GTraverseNonSumD tag (cd :: Meta) gf where+class GTraverseNonSumD tag (cd :: Symbol) gf where gTraverseNonSumD :: GenericTraverseF tag (gf p) -instance (Functor (GenericTraverseF tag), GTraverseC tag cd cc 0 gf)- => GTraverseNonSumD tag cd (C1 cc gf) where- gTraverseNonSumD = M1 <$> gTraverseC @tag @cd @cc @0+instance (Functor (GenericTraverseF tag), GTraverseC tag cd cstrName 0 gf)+ => GTraverseNonSumD tag cd (C1 (MetaCons cstrName _mc2 _mc3) gf) where+ gTraverseNonSumD = M1 <$> gTraverseC @tag @cd @cstrName @0 instance GTraverseNonSumD tag cd (l :+: r) where gTraverseNonSumD = error eNoSum instance GenericTraverse tag => GTraverseNonSumD tag cd V1 where
src/Generic/Data/Function/Traverse/Sum.hs view
@@ -1,102 +1,84 @@ {-# LANGUAGE UndecidableInstances #-} -- due to type hell {-# LANGUAGE AllowAmbiguousTypes #-} -- due to generic typeclass design +{- | 'traverse' over generic sum types.++Disambiguates constructors by prepending sum tags.++Note that the sum tag approach has efficiency limitations.+You may design a constructor disambiguation schema which permits "incrementally"+parsing, rather than parsing some whole thing then comparing to each option,+which will be faster. If you wish to perform such sum tag handling yourself, but+still want the free generics, "Generic.Data.FOnCstr" can do this for you.+-}+ module Generic.Data.Function.Traverse.Sum where import GHC.Generics-import Generic.Data.Function.Common.Generic-import Generic.Data.Function.Common.Generic.Meta import Generic.Data.Function.Traverse.Constructor+import Generic.Data.MetaParse.Cstr+import GHC.Exts ( proxy# ) -import Data.Text ( Text ) import Control.Applicative qualified as Applicative import Control.Applicative ( Alternative((<|>)) ) --- | Sum type monads that can be generically 'traverse'd.-class GenericTraverse tag => GenericTraverseSum tag where- -- | Try to parse a prefix tag of type 'pt'.- --- -- Relevant metadata is provided as arguments.- genericTraverseSumPfxTagAction- :: GenericTraverseC tag pt- => String -- ^ data type name- -> GenericTraverseF tag pt-- -- | Parse error due to no constructor matching the parsed prefix tag.- --- -- Relevant metadata is provided as arguments.- genericTraverseSumNoMatchingCstrAction- :: String -- ^ data type name- -> [String] -- ^ non-matching constructor names- -> Text -- ^ prefix tag, prettified- -> GenericTraverseF tag a---- | How to use a type as a prefix tag in a generic sum type parser.-data PfxTagCfg a = PfxTagCfg- { 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.- }+import Generic.Data.Function.Common.TypeLits ( symbolVal'' )+import GHC.TypeLits ( Symbol, KnownSymbol ) -class GTraverseSum tag gf where- -- have to stuff pt constraint in here because we can't access pt externally+class GTraverseSum tag sumtag gf where gTraverseSum- :: GenericTraverseC tag pt- => PfxTagCfg pt -> GenericTraverseF tag (gf p)+ :: ParseCstrTo sumtag pt+ -> (String -> GenericTraverseF tag pt)+ -> (forall a. String -> GenericTraverseF tag a)+ -> (pt -> pt -> Bool)+ -> GenericTraverseF tag (gf p) -instance GenericTraverse tag => GTraverseSum tag V1 where- gTraverseSum _ = genericTraverseV1 @tag+instance GenericTraverse tag => GTraverseSum tag sumtag V1 where+ gTraverseSum _parseCstr _ptGet _fNoMatch _ptEq =+ genericTraverseV1 @tag --- | Test all constructors of the given non-void data type; if they all fail,--- run a failure action and pass it all the constructors names in the type. instance- ( Alternative (GenericTraverseF tag)- , Monad (GenericTraverseF tag)- , GenericTraverseSum tag, GTraverseCSum tag cd gf- , Datatype cd- , KnownSymbols (CstrNames gf)- ) => GTraverseSum tag (D1 cd gf) where- gTraverseSum ptc = do- pt <- genericTraverseSumPfxTagAction @tag cd- M1 <$> (gTraverseCSum @tag @cd ptc pt <|> parseErrorNoMatch pt)+ ( f ~ GenericTraverseF tag+ , Alternative f+ , Monad f+ , KnownSymbol dtName+ , GTraverseCSum tag sumtag dtName gf+ ) => GTraverseSum tag sumtag (D1 (MetaData dtName _md2 _md3 _md4) gf) where+ gTraverseSum parseCstr ptGet fNoMatch ptEq = do+ pt <- ptGet dtName+ M1 <$>+ ( gTraverseCSum @tag @sumtag @dtName parseCstr ptEq pt+ <|> fNoMatch dtName) where- cd = datatypeName' @cd- parseErrorNoMatch pt =- genericTraverseSumNoMatchingCstrAction @tag cd testedCstrs- ((pfxTagCfgShow ptc) pt)- testedCstrs = symbolVals @(CstrNames gf)+ dtName = symbolVal'' @dtName -class GTraverseCSum tag cd gf where- gTraverseCSum :: PfxTagCfg pt -> pt -> GenericTraverseF tag (gf p)+class GTraverseCSum tag sumtag (dtName :: Symbol) gf where+ gTraverseCSum+ :: ParseCstrTo sumtag pt+ -> (pt -> pt -> Bool)+ -> pt+ -> GenericTraverseF tag (gf p) -- | Combine constructor options with '(<|>)' ("or"). instance ( Alternative (GenericTraverseF tag)- , GTraverseCSum tag cd l- , GTraverseCSum tag cd r- ) => GTraverseCSum tag cd (l :+: r) where- gTraverseCSum ptc pt = l <|> r+ , GTraverseCSum tag sumtag dtName l+ , GTraverseCSum tag sumtag dtName r+ ) => GTraverseCSum tag sumtag dtName (l :+: r) where+ gTraverseCSum parseCstr ptEq pt = l <|> r where- l = L1 <$> gTraverseCSum @tag @cd ptc pt- r = R1 <$> gTraverseCSum @tag @cd ptc pt+ l = L1 <$> gTraverseCSum @tag @sumtag @dtName parseCstr ptEq pt+ r = R1 <$> gTraverseCSum @tag @sumtag @dtName parseCstr ptEq pt --- | If the constructor matches the expected prefix tag, then return the action--- handling that constructor's contents, else return the empty action. instance ( Alternative (GenericTraverseF tag)- , GTraverseC tag cd cc 0 gf, Constructor cc- ) => GTraverseCSum tag cd (C1 cc gf) where- gTraverseCSum ptc pt = do- if (pfxTagCfgEq ptc) pt ptCstr- then M1 <$> gTraverseC @tag @cd @cc @0+ , GTraverseC tag dtName cstrName 0 gf+ , ReifyCstrParseResult sumtag cstrParsed+ , ForceGCParse dtName cstr (ParseCstr sumtag cstrName) ~ cstrParsed+ ) => GTraverseCSum tag sumtag dtName (C1 (MetaCons cstrName _mc2 _mc3) gf) where+ gTraverseCSum parseCstr ptEq pt = do+ if ptEq pt ptCstr+ then M1 <$> gTraverseC @tag @dtName @cstrName @0 else Applicative.empty where- ptCstr = (pfxTagCfgFromCstr ptc) (conName' @cc)+ ptCstr = parseCstr (proxy# @cstrParsed)
+ src/Generic/Data/MetaParse/Cstr.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE TemplateHaskell #-} -- due to GHC bug+{-# LANGUAGE UndecidableInstances #-} -- required below GHC 9.6++{- | Definitions for parsing data type constructor names on the type level.++Classically, when doing 'GHC.Generic.Generic' programming in Haskell that+inspects data type metadata such as constructor and record names, we reify these+early and do any parsing etc. on the term level. Constant folding should compute+much of this at compile time, so performance isn't really a worry. But if you're+doing failable operations such as parsing, you can't catch failures at compile+time.++This module provides definitions for parsing constructor names on the type+level, and is used internally in sum type generics. But wait, how do you write a+type-level string parser? That's now feasible-- see the Symparsec library :)+-}++module Generic.Data.MetaParse.Cstr+ ( CstrParser(..)+ , CstrParser'(..)+ , ForceGCParse+ , Raw+ , ParseCstrTo+ ) where++import Generic.Data.MetaParse.Internal+import Data.Kind ( type Constraint )+import GHC.TypeLits ( type Symbol, KnownSymbol )+import GHC.TypeLits ( ErrorMessage(..), type TypeError )+import GHC.Exts ( Proxy# )++-- | Constructor name parse result demotion function using 'Proxy#'.+type ParseCstrTo tag r =+ forall (x :: CstrParseResult tag)+ . ReifyCstrParseResult tag x+ => Proxy# x -> r++-- | Types defining constructor name parsers.+--+-- When defining instances of these two classes, ensure that you place an empty+-- TH splice e.g. @$(pure [])@ between the instances. This is due to a GHC bug.+class CstrParser' tag => CstrParser tag where+ -- | Constructor name parser.+ --+ -- The Symparsec library generates type families that look like this. See+ -- "Generic.Data.Cstr.Parser.Symparsec" for handy definitions.+ type ParseCstr tag (str :: Symbol)+ :: Either ErrorMessage (CstrParseResult tag)++ -- | Constraint enabling reification of the parsed type-level constructor+ -- name.+ --+ -- For example, you might reify @'(a, b) :: (Symbol, Symbol)@ with+ -- @(KnownSymbol a, KnownSymbol b)@.+ type ReifyCstrParseResult tag (x :: CstrParseResult tag) :: Constraint++-- | Types defining constructor name parsers (inner class).+--+-- We're forced to separate this associated type family from the other class due+-- to GHC complaining "type constructor cannot be used here (it is defined and+-- used in the same recursive group)".+--+-- When defining instances of these two classes, ensure that you place an empty+-- TH splice e.g. @$(pure [])@ between the instances. This is due to a GHC bug.+class CstrParser' tag where+ -- | Result kind of the constructor name parser.+ type CstrParseResult tag :: k++-- | Unwrap a generic constructor parse result. Emits a 'TypeError' on parse+-- failure.+type ForceGCParse :: Symbol -> Symbol -> Either ErrorMessage k -> k+type family ForceGCParse dtName cstr a where+ ForceGCParse _ _ (Right a) = a+ ForceGCParse dtName cstr (Left e) = TypeError+ ( Text "error while parsing "+ :<>: Text dtName :<>: Text "." :<>: Text cstr :<>: Text ":"+ :$$: e+ )++instance CstrParser' Raw where type CstrParseResult Raw = Symbol+$(pure [])+instance CstrParser Raw where+ type ParseCstr Raw str = Right str+ type ReifyCstrParseResult Raw str = KnownSymbol str
+ src/Generic/Data/MetaParse/Internal.hs view
@@ -0,0 +1,4 @@+module Generic.Data.MetaParse.Internal where++-- | Type-level parser tag. Return the string unparsed.+data Raw
src/Generic/Data/Wrappers.hs view
@@ -4,15 +4,23 @@ import GHC.TypeLits ( ErrorMessage(Text) ) +-- | Free generic wrapper where every field does "nothing" (e.g. 'mempty'.)+--+-- Maybe useful for testing?+data EmptyRec0 (a :: k)+ -- | Free generic wrapper where any field emits a type error. -- -- Useful for generic functions on void or enum types.+--+-- Note that the type you use here must still fulfill any requirements e.g. for+-- generic @foldMap@, it must be a 'Monoid', even though the instance won't be+-- used. We could perhaps falsify these requirements with some dictionary+-- cleverness, which would make using this a little easier. But I think it would+-- be in bad taste.+--+-- Consider it a further-limited 'EmptyRec0'. data NoRec0 (a :: k) type ENoRec0 = 'Text "Cannot use generic function on NoRec0-wrapped type containing fields"---- | Free generic wrapper where every field does "nothing" (e.g. 'mempty'.)------ Maybe useful for testing?-data EmptyRec0 (a :: k)
+ src/Generic/Type/CstrPath.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE UndecidableInstances #-}++module Generic.Type.CstrPath+ ( type GCstrPath+ , GCstrChoice(..)+ ) where++import GHC.Generics+import GHC.TypeLits+import Data.Type.Bool ( type If )+import Data.Type.Equality ( type (==) )+import Data.Kind ( type Type )++-- | Which direction to take at a ':+:' constructor choice.+data GCstrChoice = GoL1 -- ^ left (the 'L1' constructor)+ | GoR1 -- ^ right (the 'R1' constructor)++-- | Get the path to a named constructor in a generic type representation.+--+-- The D1 meta must already be stripped.+type GCstrPath :: Symbol -> (k -> Type) -> Either ErrorMessage [GCstrChoice]+type family GCstrPath name gf where+ -- handle the V1 case early so we don't have to keep checking later+ GCstrPath name V1 = Left (Text "type is empty (no constructors)")+ GCstrPath name gf = GCstrPath' name '[ '( '[], gf)]++type family GCstrPath' name zippers where+ GCstrPath' name ('(bcs, (l :+: r)) : zippers) =+ GCstrPath' name ('((GoL1 : bcs), l) : '((GoR1 : bcs), r) : zippers)+ GCstrPath' name ('(bcs, (C1 (MetaCons name' _ _) _)) : zippers) =+ If (name == name') (Right (Reverse bcs)) (GCstrPath' name zippers)+ GCstrPath' name '[] = Left (Text "no matching constructor")++-- | Reverse a type level list.+type Reverse as = Reverse' as '[]+type family Reverse' (as :: [k]) (acc :: [k]) :: [k] where+ Reverse' '[] acc = acc+ Reverse' (a : as) acc = Reverse' as (a : acc)