Safe Haskell | None |
---|---|
Language | Haskell2010 |
Surgeries that are just coerce
.
Warning
This is an internal module: it is not subject to any versioning policy, breaking changes can happen at any time.
If something here seems useful, please report it or create a pull request to export it from an external module.
Synopsis
- type Surgery (s :: Type) (a :: Type) = Generically (Surgery' s a)
- type ProductSurgery (s :: Type) (a :: Type) = GenericProduct (Surgery' s a)
- type Surgeries (s :: [Type]) (a :: Type) = Surgery (Cat s) a
- type ProductSurgeries (s :: [Type]) (a :: Type) = ProductSurgery (Cat s) a
- newtype Surgery' (s :: Type) (a :: Type) = Surgery' {
- unSurgery' :: a
- type family GSurgery (s :: Type) (f :: k -> Type) :: k -> Type
- derecordify :: Coercible (GSurgery Derecordify f) f => Data f p -> Data (GSurgery Derecordify f) p
- underecordify :: Coercible f (GSurgery Derecordify f) => Data (GSurgery Derecordify f) p -> Data f p
- data Derecordify :: Type
- type family GDerecordify (f :: k -> Type) :: k -> Type
- typeage :: Coercible (GSurgery Typeage f) f => Data f p -> Data (GSurgery Typeage f) p
- untypeage :: Coercible f (GSurgery Typeage f) => Data (GSurgery Typeage f) p -> Data f p
- data Typeage :: Type
- renameFields :: forall rnm f p. Coercible (GSurgery (RenameFields rnm) f) f => Data f p -> Data (GSurgery (RenameFields rnm) f) p
- unrenameFields :: forall rnm f p. Coercible (GSurgery (RenameFields rnm) f) f => Data f p -> Data (GSurgery (RenameFields rnm) f) p
- renameConstrs :: forall rnm f p. Coercible (GSurgery (RenameConstrs rnm) f) f => Data f p -> Data (GSurgery (RenameConstrs rnm) f) p
- unrenameConstrs :: forall rnm f p. Coercible (GSurgery (RenameConstrs rnm) f) f => Data f p -> Data (GSurgery (RenameConstrs rnm) f) p
- data RenameFields (rnm :: Type) :: Type
- type family GRenameFields (rnm :: Type) (f :: k -> Type) :: k -> Type
- data RenameConstrs (rnm :: Type) :: Type
- type family GRenameConstrs (rnm :: Type) (f :: k -> Type) :: k -> Type
- type family (f :: Type) @@ (s :: Symbol) :: Symbol
- data SId
- data SError
- data SConst (s :: Symbol)
- data SRename (xs :: [(Symbol, Symbol)]) (f :: Type)
- type family SRename' (xs :: [(Symbol, Symbol)]) (f :: Type) (s :: Symbol) where ...
- class UnifyRep (f :: k -> Type) (g :: k -> Type)
- onData :: (UnifyRep r s, UnifyRep s r) => p (Data r x) (Data s y) -> p (Data r x) (Data s y)
- data OnFields (f :: Type -> Type) :: Type
- type family GOnFields (f :: Type -> Type) (g :: k -> Type) :: k -> Type
- type DOnFields (f :: Type -> Type) (a :: Type) = Data (GSurgery (OnFields f) (Rep a)) ()
- data OnField (s :: Symbol) (f :: Type -> Type) :: Type
- type family GOnField (x :: Symbol) (f :: Type -> Type) (g :: k -> Type) :: k -> Type where ...
- type (%~) = OnField
- data Cat (ss :: [Type]) :: Type
- type DCat (ss :: [Type]) (a :: Type) = Data (GSurgery (Cat ss) (Rep a)) ()
- data CopyRep (a :: Type) :: Type
- copyRep :: forall a f p. Coercible (GSurgery (CopyRep a) f) f => Data f p -> Data (GSurgery (CopyRep a) f) p
- uncopyRep :: forall a f p. Coercible f (GSurgery (CopyRep a) f) => Data (GSurgery (CopyRep a) f) p -> Data f p
Surgery
type Surgery (s :: Type) (a :: Type) = Generically (Surgery' s a) Source #
Apply a microsurgery s
to a type a
for DerivingVia
.
For the Monoid
class, see ProductSurgery
.
Example
{-# LANGUAGE DerivingVia #-} -- The constructors must be visible. import Generic.Data.Microsurgery (Surgery
,Surgery'
(..),Generically
(..),Derecordify
) data T = T { unT :: Int } derivingShow
via (Surgery
Derecordify
T) -- T won't be shown as a record: -- show (T {unT = 3}) == "T 3"
type ProductSurgery (s :: Type) (a :: Type) = GenericProduct (Surgery' s a) Source #
Apply a microsurgery s
to a type a
for DerivingVia
for the
Monoid
class.
type Surgeries (s :: [Type]) (a :: Type) = Surgery (Cat s) a Source #
Plural of Surgery
. Apply a list of microsurgeries.
type ProductSurgeries (s :: [Type]) (a :: Type) = ProductSurgery (Cat s) a Source #
Plural of ProductSurgery
. Apply a list of microsurgeries.
newtype Surgery' (s :: Type) (a :: Type) Source #
See Surgery
.
Surgery' | |
|
type family GSurgery (s :: Type) (f :: k -> Type) :: k -> Type Source #
Apply a microsurgery represented by a symbol s
(declared as a dummy data
type) to a generic representation f
.
Instances
type GSurgery Derecordify (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GSurgery Typeage (M1 D ('MetaData nm md pk _nt) f :: k -> Type) Source # | |
type GSurgery (CopyRep a) (_1 :: Type -> Type) Source # | |
type GSurgery (Cat (s ': ss)) (g :: k -> Type) Source # | |
type GSurgery (Cat ('[] :: [Type])) (g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GSurgery (OnFields f) (g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GSurgery (RenameConstrs rnm) (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GSurgery (RenameFields rnm) (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GSurgery (OnField s f) (g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
Derecordify
derecordify :: Coercible (GSurgery Derecordify f) f => Data f p -> Data (GSurgery Derecordify f) p Source #
underecordify :: Coercible f (GSurgery Derecordify f) => Data (GSurgery Derecordify f) p -> Data f p Source #
data Derecordify :: Type 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.
This is a defunctionalized symbol, applied using GSurgery
or Surgery
.
Instances
type GSurgery Derecordify (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
type family GDerecordify (f :: k -> Type) :: k -> Type Source #
Instances
type GDerecordify (U1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GDerecordify (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GDerecordify (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GDerecordify (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GDerecordify (M1 C ('MetaCons nm fx _isRecord) f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery type GDerecordify (M1 C ('MetaCons nm fx _isRecord) f :: k -> Type) = M1 C ('MetaCons nm fx 'False) (GDerecordify f) | |
type GDerecordify (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GDerecordify (M1 S ('MetaSel _nm su ss ds) f :: k -> Type) Source # | |
Type aging ("denewtypify")
Renaming
renameFields :: forall rnm f p. Coercible (GSurgery (RenameFields rnm) f) f => Data f p -> Data (GSurgery (RenameFields rnm) f) p Source #
unrenameFields :: forall rnm f p. Coercible (GSurgery (RenameFields rnm) f) f => Data f p -> Data (GSurgery (RenameFields rnm) f) p Source #
renameConstrs :: forall rnm f p. Coercible (GSurgery (RenameConstrs rnm) f) f => Data f p -> Data (GSurgery (RenameConstrs rnm) f) p Source #
unrenameConstrs :: forall rnm f p. Coercible (GSurgery (RenameConstrs rnm) f) f => Data f p -> Data (GSurgery (RenameConstrs rnm) f) p Source #
data RenameFields (rnm :: Type) :: Type 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 }
This is a defunctionalized symbol, applied using GSurgery
or Surgery
.
Instances
type GSurgery (RenameFields rnm) (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
type family GRenameFields (rnm :: Type) (f :: k -> Type) :: k -> Type Source #
Instances
type GRenameFields rnm (U1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (M1 C m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameFields rnm (M1 S ('MetaSel ('Just nm) su ss ds) f :: k -> Type) Source # | |
data RenameConstrs (rnm :: Type) :: Type 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 }
This is a defunctionalized symbol, applied using GSurgery
or Surgery
.
Instances
type GSurgery (RenameConstrs rnm) (f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
type family GRenameConstrs (rnm :: Type) (f :: k -> Type) :: k -> Type Source #
Instances
type GRenameConstrs rnm (V1 :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameConstrs rnm (f :*: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameConstrs rnm (f :+: g :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameConstrs rnm (M1 C ('MetaCons nm fi ir) f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
type GRenameConstrs rnm (M1 D m f :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery |
Defining symbol functions
type family (f :: Type) @@ (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 :: Type) 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 :: Type) (s :: Symbol) where ... Source #
Closed type family for SRename
.
Other
class UnifyRep (f :: k -> Type) (g :: k -> Type) Source #
Unify the "spines" of two generic representations (the "spine" is everything except the field types).
Instances
g' ~ (U1 :: k -> Type) => UnifyRep (U1 :: k -> Type) (g' :: k -> Type) Source # | |
Defined in Generic.Data.Internal.Microsurgery | |
g' ~ (V1 :: k -> Type) => UnifyRep (V1 :: 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' ~ (K1 i b :: k -> Type) => UnifyRep (K1 i a :: 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 GOnFields (f :: Type -> Type) (g :: k -> Type) :: k -> Type Source #
type DOnFields (f :: Type -> Type) (a :: Type) = Data (GSurgery (OnFields f) (Rep a)) () Source #
Apply a type constructor f
to every field type of a type a
to make a
synthetic type.
data OnField (s :: Symbol) (f :: Type -> Type) :: Type Source #
Apply a type constructor f
to the field named s
in a generic record r
.
data Vec a = Vec { len :: Int , contents :: [a] } -- with (OnField "len" Sum) becomes -- data Vec a = Vec { len :: Sum Int , contents :: [a] }
This is a defunctionalized symbol, applied using GSurgery
or Surgery
.
See also the synonym (
.%~
)
type family GOnField (x :: Symbol) (f :: Type -> Type) (g :: k -> Type) :: k -> Type where ... Source #
GOnField x f (M1 S ('MetaSel ('Just x) a b c) (K1 i t)) = M1 S ('MetaSel ('Just x) a b c) (K1 i (f t)) | |
GOnField x f (M1 S m r) = M1 S m r | |
GOnField x f (M1 C m r) = M1 C m (GOnField x f r) | |
GOnField x f (M1 D m r) = M1 D m (GOnField x f r) | |
GOnField x f (r :+: s) = GOnField x f r :+: GOnField x f s | |
GOnField x f (r :*: s) = GOnField x f r :*: GOnField x f s | |
GOnField x f (K1 i a) = K1 i (f a) | |
GOnField x f U1 = U1 | |
GOnField x f V1 = V1 |
type (%~) = OnField infixr 4 Source #
Infix name for OnField
. To be used with Surgeries
or Cat
.
Examples
Transform one Int
field into
for deriving Sum
IntMonoid
:
data Vec a = Vec { len :: Int , contents :: [a] } deriving Generic deriving (Eq, Show) via Generically (Vec a) deriving (Semigroup, Monoid) viaProductSurgeries
'["len"%~
Sum
] (Vec a)
Wrap unshowable fields in Opaque
for deriving Show
:
data Unshowable = Unshowable { fun :: Int -> Int , io :: IO Bool , int :: Int } deriving Generic deriving Show viaSurgeries
'["fun"%~
Opaque
, "io"%~
Opaque
] Unshowable -- show (Unshowable id (pure True) 42) = "Unshowable _ _ 42"
data Cat (ss :: [Type]) :: Type Source #
Compose surgeries together.
type DCat (ss :: [Type]) (a :: Type) = Data (GSurgery (Cat ss) (Rep a)) () Source #
Make a synthetic type (Data
) by chaining multiple surgeries.
data CopyRep (a :: Type) :: Type Source #
Change the generic representation to that of another type a
.