Safe Haskell | None |
---|---|
Language | Haskell2010 |
Surgeries that are just coerce
.
Synopsis
- derecordify :: Coercible (Derecordify f) f => Data f p -> Data (Derecordify f) p
- underecordify :: Coercible f (Derecordify f) => Data (Derecordify f) p -> Data f p
- type family Derecordify (f :: k -> *) :: k -> *
- typeage :: Coercible (Typeage f) f => Data f p -> Data (Typeage f) p
- untypeage :: Coercible f (Typeage f) => Data (Typeage f) p -> Data f p
- type family Typeage (f :: k -> *) :: k -> *
- renameFields :: forall rnm f p. Coercible (RenameFields rnm f) f => Data f p -> Data (RenameFields rnm f) p
- unrenameFields :: forall rnm f p. Coercible (RenameFields rnm f) f => Data f p -> Data (RenameFields rnm f) p
- renameConstrs :: forall rnm f p. Coercible (RenameConstrs rnm f) f => Data f p -> Data (RenameConstrs rnm f) p
- unrenameConstrs :: forall rnm f p. Coercible (RenameConstrs rnm f) f => Data f p -> Data (RenameConstrs rnm f) p
- type family RenameFields (rnm :: *) (f :: k -> *) :: k -> *
- type family RenameConstrs (rnm :: *) (f :: k -> *) :: k -> *
- type family (f :: *) @@ (s :: Symbol) :: Symbol
- data SId
- data SError
- data SConst (s :: Symbol)
- data SRename (xs :: [(Symbol, Symbol)]) (f :: *)
- type family SRename' (xs :: [(Symbol, Symbol)]) (f :: *) (s :: Symbol) where ...
- class UnifyRep (f :: k -> *) (g :: k -> *)
- onData :: (UnifyRep r s, UnifyRep s r) => p (Data r x) (Data s y) -> p (Data r x) (Data s y)
- type family OnFields (f :: * -> *) (r :: k -> *) :: k -> *
- type DOnFields (f :: * -> *) (a :: *) = Data (OnFields f (Rep a)) ()
Derecordify
derecordify :: Coercible (Derecordify f) f => Data f p -> Data (Derecordify f) p Source #
underecordify :: Coercible f (Derecordify f) => Data (Derecordify f) p -> Data f p Source #
type family Derecordify (f :: k -> *) :: k -> * Source #
Forget that a type was declared using record syntax.
data Foo = Bar { baz :: Zap } -- becomes -- data Foo = Bar Zap
Concretely, set the last field of MetaCons
to False
and forget field
names.
Instances
type Derecordify (U1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type Derecordify (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type Derecordify (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type Derecordify (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type Derecordify (M1 S (MetaSel _nm su ss ds) f :: k -> Type) Source # | |
type Derecordify (M1 C (MetaCons nm fx _isRecord) f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery type Derecordify (M1 C (MetaCons nm fx _isRecord) f :: k -> Type) = M1 C (MetaCons nm fx False) (Derecordify f) | |
type Derecordify (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
Type aging ("denewtypify")
type family Typeage (f :: k -> *) :: k -> * Source #
Forget that a type is a newtype
.
newtype Foo = Bar Baz -- becomes -- data Foo = Bar Baz
Renaming
renameFields :: forall rnm f p. Coercible (RenameFields rnm f) f => Data f p -> Data (RenameFields rnm f) p Source #
unrenameFields :: forall rnm f p. Coercible (RenameFields rnm f) f => Data f p -> Data (RenameFields rnm f) p Source #
renameConstrs :: forall rnm f p. Coercible (RenameConstrs rnm f) f => Data f p -> Data (RenameConstrs rnm f) p Source #
unrenameConstrs :: forall rnm f p. Coercible (RenameConstrs rnm f) f => Data f p -> Data (RenameConstrs rnm f) p Source #
type family RenameFields (rnm :: *) (f :: k -> *) :: k -> * Source #
Rename fields using the function rnm
given as a parameter.
data Foo = Bar { baz :: Zap } -- becomes, renaming "baz" to "bag" -- data Foo = Bar { bag :: Zap }
Instances
type RenameFields rnm (U1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (M1 C m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameFields rnm (M1 S (MetaSel (Just nm) su ss ds) f :: k -> Type) Source # | |
type family RenameConstrs (rnm :: *) (f :: k -> *) :: k -> * Source #
Rename constructors using the function rnm
given as a parameter.
data Foo = Bar { baz :: Zap } -- becomes, renaming "Bar" to "Car" -- data Foo = Car { baz :: Zap }
Instances
type RenameConstrs rnm (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameConstrs rnm (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameConstrs rnm (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameConstrs rnm (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type RenameConstrs rnm (M1 C (MetaCons nm fi ir) f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
Defining symbol functions
type family (f :: *) @@ (s :: Symbol) :: Symbol Source #
f @@ s
is the application of a type-level function symbolized by f
to a s ::
.Symbol
A function FooToBar
can be defined as follows:
data FooToBar
type instance FooToBar @@
"foo" = "bar"
Empty function (compile-time error when applied).
data SRename (xs :: [(Symbol, Symbol)]) (f :: *) Source #
Define a function for a fixed set of strings, and fall back to f
for the others.
type family SRename' (xs :: [(Symbol, Symbol)]) (f :: *) (s :: Symbol) where ... Source #
Closed type family for SRename
.
Other
class UnifyRep (f :: k -> *) (g :: k -> *) Source #
Unify the "spines" of two generic representations (the "spine" is everything except the field types).
Instances
g' ~ (V1 :: k -> Type) => UnifyRep (V1 :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
g' ~ (U1 :: k -> Type) => UnifyRep (U1 :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
g' ~ (K1 i b :: k -> Type) => UnifyRep (K1 i a :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
(g' ~ (g1 :*: g2), UnifyRep f1 g1, UnifyRep f2 g2) => UnifyRep (f1 :*: f2 :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
(g' ~ (g1 :+: g2), UnifyRep f1 g1, UnifyRep f2 g2) => UnifyRep (f1 :+: f2 :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
(g' ~ M1 s c g, UnifyRep f g) => UnifyRep (M1 s c f :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
onData :: (UnifyRep r s, UnifyRep s r) => p (Data r x) (Data s y) -> p (Data r x) (Data s y) Source #
onData :: _ => (Data r x -> Data s y) -> (Data r x -> Data s y) -- possible specialization
Can be used with generic-lens
for type-changing field updates with field_
(and possibly other generic optics).
A specialization of the identity function to be used to fix types
of functions on Data
, unifying the "spines" of input and output generic
representations (the "spine" is everything except field types, which may
thus change).
type family OnFields (f :: * -> *) (r :: k -> *) :: k -> * Source #
Apply a type constructor f
to every field type of a generic
representation r
.