| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Generic.Data.Internal.Microsurgery
Description
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 }
deriving Show 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.
Constructors
| Surgery' | |
Fields
| |
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 ZapConcretely, 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 #
Equations
| 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) via ProductSurgeries '["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 via Surgeries '["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.