-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Deriving instances with GHC.Generics and related utilities -- -- Generic implementations of standard type classes. Operations on -- generic representations to help using GHC.Generics. See README. @package generic-data @version 0.6.0.0 module Generic.Data.Internal.Compat -- | Lift the standard readPrec and readListPrec functions -- through the type constructor. readPrec1 :: (Read1 f, Read a) => ReadPrec (f a) -- | Division (round down) of natural numbers. Div x 0 is -- undefined (i.e., it cannot be reduced). type family Div (a :: Nat) (b :: Nat) :: Nat infixl 7 `Div` -- | Generic deriving for Enum. module Generic.Data.Internal.Enum -- | Generic toEnum generated with the StandardEnum option. -- --
-- instance Enum MyType where -- toEnum = gtoEnum -- fromEnum = gfromEnum -- enumFrom = genumFrom -- enumFromThen = genumFromThen -- enumFromTo = genumFromTo -- enumFromThenTo = genumFromThenTo --gtoEnum :: forall a. (Generic a, GEnum StandardEnum (Rep a)) => Int -> a -- | Generic fromEnum generated with the StandardEnum option. -- -- See also gtoEnum. gfromEnum :: (Generic a, GEnum StandardEnum (Rep a)) => a -> Int -- | Generic enumFrom generated with the StandardEnum option. -- -- See also gtoEnum. genumFrom :: (Generic a, GEnum StandardEnum (Rep a)) => a -> [a] -- | Generic enumFromThen generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromThen :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromTo generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromTo :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromThenTo generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromThenTo :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> a -> [a] -- | Generic toEnum generated with the FiniteEnum option. -- --
-- instance Enum MyType where -- toEnum = gtoFiniteEnum -- fromEnum = gfromFiniteEnum -- enumFrom = gfiniteEnumFrom -- enumFromThen = gfiniteEnumFromThen -- enumFromTo = gfiniteEnumFromTo -- enumFromThenTo = gfiniteEnumFromThenTo --gtoFiniteEnum :: forall a. (Generic a, GEnum FiniteEnum (Rep a)) => Int -> a -- | Generic fromEnum generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfromFiniteEnum :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> Int -- | Generic enumFrom generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfiniteEnumFrom :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> [a] -- | Generic enumFromThen generated with the FiniteEnum -- option. -- -- See also gtoFiniteEnum. gfiniteEnumFromThen :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromTo generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfiniteEnumFromTo :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromThenTo generated with the FiniteEnum -- option. -- -- See also gtoFiniteEnum. gfiniteEnumFromThenTo :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> a -> [a] -- | Unsafe generic toEnum. Does not check whether the argument is -- within valid bounds. Use gtoEnum or gtoFiniteEnum -- instead. gtoEnumRaw' :: forall opts a. (Generic a, GEnum opts (Rep a)) => Int -> a -- | Generic toEnum. Use gfromEnum or gfromFiniteEnum -- instead. gtoEnum' :: forall opts a. (Generic a, GEnum opts (Rep a)) => String -> Int -> a -- | Generic fromEnum. Use gfromEnum or -- gfromFiniteEnum instead. gfromEnum' :: forall opts a. (Generic a, GEnum opts (Rep a)) => a -> Int -- |
-- genumMin == gfromEnum gminBound --genumMin :: Int -- |
-- genumMax == gfromEnum gmaxBound --genumMax :: forall opts a. (Generic a, GEnum opts (Rep a)) => Int -- | Generic enumFrom. Use genumFrom or -- gfiniteEnumFrom instead. genumFrom' :: forall opts a. (Generic a, GEnum opts (Rep a)) => a -> [a] -- | Generic enumFromThen. Use genumFromThen or -- gfiniteEnumFromThen instead. genumFromThen' :: forall opts a. (Generic a, GEnum opts (Rep a)) => a -> a -> [a] -- | Generic enumFromTo. Use genumFromTo or -- gfiniteEnumFromTo instead. genumFromTo' :: forall opts a. (Generic a, GEnum opts (Rep a)) => a -> a -> [a] -- | Generic enumFromThenTo. Use genumFromThenTo or -- gfiniteEnumFromThenTo instead. genumFromThenTo' :: forall opts a. (Generic a, GEnum opts (Rep a)) => a -> a -> a -> [a] -- | Generic minBound. -- --
-- instance Bounded MyType where -- minBound = gminBound -- maxBound = gmaxBound --gminBound :: (Generic a, GBounded (Rep a)) => a -- | Generic maxBound. -- -- See also gminBound. gmaxBound :: (Generic a, GBounded (Rep a)) => a -- | Generic representation of Enum types. -- -- The opts parameter is a type-level option to select different -- implementations. class GEnum opts f gCardinality :: GEnum opts f => Int gFromEnum :: GEnum opts f => f p -> Int gToEnum :: GEnum opts f => Int -> f p -- | Standard option for GEnum: derive Enum for types with -- only nullary constructors (the same restrictions as in the Haskell -- 2010 report). data StandardEnum -- | Extends the StandardEnum option for GEnum to allow all -- constructors to have arbitrary many fields. Each field type must be an -- instance of both Enum and Bounded. Two restrictions -- require the user's caution: -- --
-- data Example = C0 Bool Bool | C1 Bool -- deriving (Eq, Ord, Show, Generic) -- -- cardinality = 6 -- 2 * 2 + 2 -- -- Bool * Bool | Bool -- -- enumeration = -- [ C0 False False -- , C0 False True -- , C0 True False -- , C0 True True -- , C1 False -- , C1 True -- ] -- -- enumeration == map gtoFiniteEnum [0 .. 5] -- [0 .. 5] == map gfromFiniteEnum enumeration --data FiniteEnum -- | Generic representation of Bounded types. class GBounded f gMinBound :: GBounded f => f p gMaxBound :: GBounded f => f p instance Generic.Data.Internal.Enum.GBounded f => Generic.Data.Internal.Enum.GBounded (GHC.Generics.M1 i c f) instance Generic.Data.Internal.Enum.GBounded GHC.Generics.U1 instance GHC.Enum.Bounded c => Generic.Data.Internal.Enum.GBounded (GHC.Generics.K1 i c) instance (Generic.Data.Internal.Enum.GBounded f, Generic.Data.Internal.Enum.GBounded g) => Generic.Data.Internal.Enum.GBounded (f GHC.Generics.:+: g) instance (Generic.Data.Internal.Enum.GBounded f, Generic.Data.Internal.Enum.GBounded g) => Generic.Data.Internal.Enum.GBounded (f GHC.Generics.:*: g) instance (Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.FiniteEnum f, Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.FiniteEnum g) => Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.FiniteEnum (f GHC.Generics.:*: g) instance (GHC.Enum.Bounded c, GHC.Enum.Enum c) => Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.FiniteEnum (GHC.Generics.K1 i c) instance Generic.Data.Internal.Enum.GEnum opts f => Generic.Data.Internal.Enum.GEnum opts (GHC.Generics.M1 i c f) instance (Generic.Data.Internal.Enum.GEnum opts f, Generic.Data.Internal.Enum.GEnum opts g) => Generic.Data.Internal.Enum.GEnum opts (f GHC.Generics.:+: g) instance Generic.Data.Internal.Enum.GEnum opts GHC.Generics.U1 -- | Type level functions on generic representations. module Generic.Data.Internal.Functions -- | Number of constructors of a data type. type family NConstructors (r :: k -> Type) :: Nat -- | Number of constructors of a data type. nconstructors :: forall r. KnownNat (NConstructors r) => Integer -- | Arity of a constructor. type family NFields (r :: k -> Type) :: Nat -- | Arity of a constructor. nfields :: forall r. KnownNat (NFields r) => Integer -- | Type metadata accessors -- -- Type names, constructor names... module Generic.Data.Internal.Meta -- | Name of the first data constructor in a type as a string. -- --
-- gdatatypeName @(Maybe AnyType) = "Maybe" --gdatatypeName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the module where the first type constructor is defined. -- --
-- gmoduleName @(Maybe AnyType) = "GHC.Base" --gmoduleName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the package where the first type constructor is defined. -- --
-- gpackageName @(Maybe AnyType) = "base" --gpackageName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | True if the first type constructor is a newtype. gisNewtype :: forall a. (Generic a, GDatatype (Rep a)) => Bool fromDatatype :: forall d r. Datatype d => (M1 D d Proxy () -> r) -> r -- | Generic representations that contain datatype metadata. class GDatatype f gDatatypeName :: GDatatype f => String gModuleName :: GDatatype f => String gPackageName :: GDatatype f => String gIsNewtype :: GDatatype f => Bool -- | Name of the first constructor in a value. -- --
-- gconName (Just 0) = "Just" --gconName :: forall a. Constructors a => a -> String -- | The fixity of the first constructor. -- --
-- gconFixity (Just 0) = Prefix -- gconFixity ([] :*: id) = Infix RightAssociative 6 --gconFixity :: forall a. Constructors a => a -> Fixity -- | True if the constructor is a record. -- --
-- gconIsRecord (Just 0) = False
-- gconIsRecord (Sum 0) = True
-- -- newtype Sum a = Sum { getSum :: a }
--
gconIsRecord :: forall a. Constructors a => a -> Bool
-- | Number of constructors.
--
-- -- gconNum @(Maybe AnyType) = 2 --gconNum :: forall a. Constructors a => Int -- | Index of a constructor. -- --
-- gconIndex Nothing = 0 -- gconIndex (Just "test") = 1 --gconIndex :: forall a. Constructors a => a -> Int -- | An opaque identifier for a constructor. newtype ConId a ConId :: Int -> ConId a -- | Identifier of a constructor. conId :: forall a. Constructors a => a -> ConId a -- | Index of a constructor, given its identifier. See also -- gconIndex. conIdToInt :: forall a. ConId a -> Int -- | Name of a constructor. See also gconName. conIdToString :: forall a. Constructors a => ConId a -> String -- | All constructor identifiers. -- --
-- gconNum @a = length (conIdEnum @a) --conIdEnum :: forall a. Constructors a => [ConId a] -- | This must not be called on an empty type. conIdMin :: forall a. Constructors a => ConId a -- | This must not be called on an empty type. conIdMax :: forall a. Constructors a => ConId a -- | Constraint synonym for Generic and GConstructors. class (Generic a, GConstructors (Rep a)) => Constructors a newtype GConId r GConId :: Int -> GConId r gConIdToInt :: GConId r -> Int toConId :: forall a. Generic a => GConId (Rep a) -> ConId a fromConId :: forall a. Generic a => ConId a -> GConId (Rep a) reGConId :: GConId r -> GConId s gConIdMin :: forall r. GConstructors r => GConId r gConIdMax :: forall r. GConstructors r => GConId r -- | Generic representations that contain constructor metadata. class GConstructors r gConIdToString :: GConstructors r => GConId r -> String gConId :: GConstructors r => r p -> GConId r gConNum :: GConstructors r => Int gConFixity :: GConstructors r => r p -> Fixity gConIsRecord :: GConstructors r => r p -> Bool -- | Meta field of the M1 type constructor. type family MetaOf (f :: * -> *) :: Meta -- | Name of the data type (MetaData). type family MetaDataName (m :: Meta) :: Symbol -- | Name of the module where the data type is defined (MetaData) type family MetaDataModule (m :: Meta) :: Symbol -- | Name of the package where the data type is defined (MetaData) type family MetaDataPackage (m :: Meta) :: Symbol -- | True if the data type is a newtype (MetaData). type family MetaDataNewtype (m :: Meta) :: Bool -- | Name of the constructor (MetaCons). type family MetaConsName (m :: Meta) :: Symbol -- | Fixity of the constructor (MetaCons). type family MetaConsFixity (m :: Meta) :: FixityI -- | True for a record constructor (MetaCons). type family MetaConsRecord (m :: Meta) :: Bool -- | Just the name of the record field, if it is one -- (MetaSel). type family MetaSelNameM (m :: Meta) :: Maybe Symbol -- | Name of the record field; undefined for non-record fields -- (MetaSel). type family MetaSelName (m :: Meta) :: Symbol -- | Unpackedness annotation of a field (MetaSel). type family MetaSelUnpack (m :: Meta) :: SourceUnpackedness -- | Strictness annotation of a field (MetaSel). type family MetaSelSourceStrictness (m :: Meta) :: SourceStrictness -- | Inferred strictness of a field (MetaSel). type family MetaSelStrictness (m :: Meta) :: DecidedStrictness -- | A placeholder for Meta values. type DummyMeta = 'MetaData "" "" "" 'False -- | Remove an M1 type constructor. type family UnM1 (f :: k -> *) :: k -> * instance forall k (r :: k). GHC.Classes.Ord (Generic.Data.Internal.Meta.GConId r) instance forall k (r :: k). GHC.Classes.Eq (Generic.Data.Internal.Meta.GConId r) instance forall k (a :: k). GHC.Classes.Ord (Generic.Data.Internal.Meta.ConId a) instance forall k (a :: k). GHC.Classes.Eq (Generic.Data.Internal.Meta.ConId a) instance (GHC.Generics.Generic a, Generic.Data.Internal.Meta.GConstructors (GHC.Generics.Rep a)) => Generic.Data.Internal.Meta.Constructors a instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Generic.Data.Internal.Meta.GConstructors f => Generic.Data.Internal.Meta.GConstructors (GHC.Generics.M1 GHC.Generics.D c f) instance forall k (f :: k -> *) (g :: k -> *). (Generic.Data.Internal.Meta.GConstructors f, Generic.Data.Internal.Meta.GConstructors g) => Generic.Data.Internal.Meta.GConstructors (f GHC.Generics.:+: g) instance forall k (c :: GHC.Generics.Meta) (f :: k -> *). GHC.Generics.Constructor c => Generic.Data.Internal.Meta.GConstructors (GHC.Generics.M1 GHC.Generics.C c f) instance forall k (d :: GHC.Generics.Meta) (f :: k -> *). GHC.Generics.Datatype d => Generic.Data.Internal.Meta.GDatatype (GHC.Generics.M1 GHC.Generics.D d f) -- | Pack/unpack newtypes. module Generic.Data.Internal.Newtype -- | Class of newtypes. There is an instance Newtype a if -- and only if a is a newtype and an instance of Generic. class (Generic a, Coercible a (Old a), Newtype' a) => Newtype a -- | The type wrapped by a newtype. -- --
-- newtype Foo = Foo { bar :: Bar } deriving Generic
-- -- Old Foo ~ Bar
--
type Old a = GOld (Rep a)
type family GOld (f :: * -> *)
-- | Use Newtype instead.
type Newtype' a = NewtypeErr a (MetaDataNewtype (MetaOf (Rep a)))
type family NewtypeErr a (b :: Bool) :: Constraint
-- | Generic newtype destructor.
unpack :: Newtype a => a -> Old a
-- | Generic newtype constructor.
pack :: Newtype a => Old a -> a
instance (GHC.Generics.Generic a, GHC.Types.Coercible a (Generic.Data.Internal.Newtype.Old a), Generic.Data.Internal.Newtype.Newtype' a) => Generic.Data.Internal.Newtype.Newtype a
module Generic.Data.Internal.Resolvers
-- | A newtype whose instances for simple classes (Eq, Ord,
-- Read, Show) use higher-kinded class instances for
-- f (Eq1, Ord1, Read1, Show1).
newtype Id1 f a
Id1 :: f a -> Id1 f a
[unId1] :: Id1 f a -> f a
-- | A newtype with trivial instances, that considers every value
-- equivalent to every other one, and shows as just "_".
newtype Opaque a
Opaque :: a -> Opaque a
[unOpaque] :: Opaque a -> a
-- | A higher-kinded version of Opaque.
newtype Opaque1 f a
Opaque1 :: f a -> Opaque1 f a
[unOpaque1] :: Opaque1 f a -> f a
instance Data.Functor.Classes.Show1 f => Data.Functor.Classes.Show1 (Generic.Data.Internal.Resolvers.Id1 f)
instance Data.Functor.Classes.Read1 f => Data.Functor.Classes.Read1 (Generic.Data.Internal.Resolvers.Id1 f)
instance Data.Functor.Classes.Ord1 f => Data.Functor.Classes.Ord1 (Generic.Data.Internal.Resolvers.Id1 f)
instance Data.Functor.Classes.Eq1 f => Data.Functor.Classes.Eq1 (Generic.Data.Internal.Resolvers.Id1 f)
instance GHC.Classes.Eq (Generic.Data.Internal.Resolvers.Opaque1 f a)
instance GHC.Classes.Ord (Generic.Data.Internal.Resolvers.Opaque1 f a)
instance GHC.Show.Show (Generic.Data.Internal.Resolvers.Opaque1 f a)
instance Data.Functor.Classes.Eq1 (Generic.Data.Internal.Resolvers.Opaque1 f)
instance Data.Functor.Classes.Ord1 (Generic.Data.Internal.Resolvers.Opaque1 f)
instance Data.Functor.Classes.Show1 (Generic.Data.Internal.Resolvers.Opaque1 f)
instance GHC.Classes.Eq (Generic.Data.Internal.Resolvers.Opaque a)
instance GHC.Classes.Ord (Generic.Data.Internal.Resolvers.Opaque a)
instance GHC.Show.Show (Generic.Data.Internal.Resolvers.Opaque a)
instance Data.Functor.Classes.Eq1 Generic.Data.Internal.Resolvers.Opaque
instance Data.Functor.Classes.Ord1 Generic.Data.Internal.Resolvers.Opaque
instance Data.Functor.Classes.Show1 Generic.Data.Internal.Resolvers.Opaque
instance (Data.Functor.Classes.Eq1 f, GHC.Classes.Eq a) => GHC.Classes.Eq (Generic.Data.Internal.Resolvers.Id1 f a)
instance (Data.Functor.Classes.Ord1 f, GHC.Classes.Ord a) => GHC.Classes.Ord (Generic.Data.Internal.Resolvers.Id1 f a)
instance (Data.Functor.Classes.Read1 f, GHC.Read.Read a) => GHC.Read.Read (Generic.Data.Internal.Resolvers.Id1 f a)
instance (Data.Functor.Classes.Show1 f, GHC.Show.Show a) => GHC.Show.Show (Generic.Data.Internal.Resolvers.Id1 f a)
module Generic.Data.Internal.Show
-- | Generic showsPrec.
--
-- -- instance Show MyType where -- showsPrec = gshowsPrec --gshowsPrec :: (Generic a, GShow0 (Rep a)) => Int -> a -> ShowS gprecShows :: (Generic a, GShow0 (Rep a)) => a -> PrecShowS -- | Generic representation of Show types. type GShow0 = GShow Proxy -- | Generic liftShowsPrec. gliftShowsPrec :: (Generic1 f, GShow1 (Rep1 f)) => (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS gLiftPrecShows :: GShow1 f => (Int -> a -> ShowS) -> ([a] -> ShowS) -> f a -> PrecShowS type ShowsPrec a = (Int -> a -> ShowS, [a] -> ShowS) -- | Generic representation of Show1 types. type GShow1 = GShow Identity class GShow p f gPrecShows :: GShow p f => p (ShowsPrec a) -> f a -> PrecShowS class GShowC p c f gPrecShowsC :: GShowC p c f => p (ShowsPrec a) -> String -> Fixity -> M1 C c f a -> PrecShowS class GShowFields p f gPrecShowsFields :: GShowFields p f => p (ShowsPrec a) -> f a -> [PrecShowS] class GShowNamed p f gPrecShowsNamed :: GShowNamed p f => p (ShowsPrec a) -> f a -> ShowFields class GShowSingle p f gPrecShowsSingle :: GShowSingle p f => p (ShowsPrec a) -> f a -> PrecShowS instance Generic.Data.Internal.Show.GShowSingle p f => Generic.Data.Internal.Show.GShowFields p (GHC.Generics.M1 GHC.Generics.S c f) instance (GHC.Generics.Selector c, Generic.Data.Internal.Show.GShowSingle p f) => Generic.Data.Internal.Show.GShowNamed p (GHC.Generics.M1 GHC.Generics.S c f) instance GHC.Show.Show a => Generic.Data.Internal.Show.GShowSingle p (GHC.Generics.K1 i a) instance Data.Functor.Classes.Show1 f => Generic.Data.Internal.Show.GShowSingle Data.Functor.Identity.Identity (GHC.Generics.Rec1 f) instance Generic.Data.Internal.Show.GShowSingle Data.Functor.Identity.Identity GHC.Generics.Par1 instance (Generic.Data.Internal.Show.GShowSingle Data.Functor.Identity.Identity f, Generic.Data.Internal.Show.GShowSingle p g) => Generic.Data.Internal.Show.GShowSingle p (f GHC.Generics.:.: g) instance Generic.Data.Internal.Show.GShowNamed p f => Generic.Data.Internal.Show.GShowC p ('GHC.Generics.MetaCons s y 'GHC.Types.True) f instance (Generic.Data.Internal.Show.GShowNamed p f, Generic.Data.Internal.Show.GShowNamed p g) => Generic.Data.Internal.Show.GShowNamed p (f GHC.Generics.:*: g) instance Generic.Data.Internal.Show.GShowNamed p GHC.Generics.U1 instance Generic.Data.Internal.Show.GShowFields p f => Generic.Data.Internal.Show.GShowC p ('GHC.Generics.MetaCons s y 'GHC.Types.False) f instance (Generic.Data.Internal.Show.GShowFields p f, Generic.Data.Internal.Show.GShowFields p g) => Generic.Data.Internal.Show.GShowFields p (f GHC.Generics.:*: g) instance Generic.Data.Internal.Show.GShowFields p GHC.Generics.U1 instance (GHC.Generics.Constructor c, Generic.Data.Internal.Show.GShowC p c f) => Generic.Data.Internal.Show.GShow p (GHC.Generics.M1 GHC.Generics.C c f) instance Generic.Data.Internal.Show.GShow p f => Generic.Data.Internal.Show.GShow p (GHC.Generics.M1 GHC.Generics.D d f) instance (Generic.Data.Internal.Show.GShow p f, Generic.Data.Internal.Show.GShow p g) => Generic.Data.Internal.Show.GShow p (f GHC.Generics.:+: g) instance Generic.Data.Internal.Show.GShow p GHC.Generics.V1 -- | Generic representations as data types. module Generic.Data.Internal.Data -- | Synthetic data type. -- -- A wrapper to view a generic Rep as the datatype it's supposed -- to represent, without needing a declaration. newtype Data r p Data :: r p -> Data r p [unData] :: Data r p -> r p -- | Conversion between a generic type and the synthetic type made using -- its representation. toData :: Generic a => a -> Data (Rep a) p -- | Inverse of fromData. fromData :: Generic a => Data (Rep a) p -> a instance GHC.Base.Monoid (r p) => GHC.Base.Monoid (Generic.Data.Internal.Data.Data r p) instance GHC.Base.Semigroup (r p) => GHC.Base.Semigroup (Generic.Data.Internal.Data.Data r p) instance Data.Functor.Classes.Ord1 r => Data.Functor.Classes.Ord1 (Generic.Data.Internal.Data.Data r) instance Data.Functor.Classes.Eq1 r => Data.Functor.Classes.Eq1 (Generic.Data.Internal.Data.Data r) instance GHC.Classes.Ord (r p) => GHC.Classes.Ord (Generic.Data.Internal.Data.Data r p) instance GHC.Classes.Eq (r p) => GHC.Classes.Eq (Generic.Data.Internal.Data.Data r p) instance Data.Functor.Contravariant.Contravariant r => Data.Functor.Contravariant.Contravariant (Generic.Data.Internal.Data.Data r) instance GHC.Base.MonadPlus r => GHC.Base.MonadPlus (Generic.Data.Internal.Data.Data r) instance GHC.Base.Monad r => GHC.Base.Monad (Generic.Data.Internal.Data.Data r) instance GHC.Base.Alternative r => GHC.Base.Alternative (Generic.Data.Internal.Data.Data r) instance GHC.Base.Applicative r => GHC.Base.Applicative (Generic.Data.Internal.Data.Data r) instance Data.Traversable.Traversable r => Data.Traversable.Traversable (Generic.Data.Internal.Data.Data r) instance Data.Foldable.Foldable r => Data.Foldable.Foldable (Generic.Data.Internal.Data.Data r) instance GHC.Base.Functor r => GHC.Base.Functor (Generic.Data.Internal.Data.Data r) instance (GHC.Base.Functor r, Data.Functor.Contravariant.Contravariant r) => GHC.Generics.Generic (Generic.Data.Internal.Data.Data r p) instance GHC.Generics.Generic1 (Generic.Data.Internal.Data.Data r) instance (Generic.Data.Internal.Show.GShow1 r, GHC.Show.Show p) => GHC.Show.Show (Generic.Data.Internal.Data.Data r p) instance Generic.Data.Internal.Show.GShow1 r => Data.Functor.Classes.Show1 (Generic.Data.Internal.Data.Data r) instance Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.StandardEnum r => GHC.Enum.Enum (Generic.Data.Internal.Data.Data r p) instance Generic.Data.Internal.Enum.GBounded r => GHC.Enum.Bounded (Generic.Data.Internal.Data.Data r p) module Generic.Data.Internal.Utils -- | Coerce while preserving the type index. coerce' :: Coercible (f x) (g x) => f x -> g x -- | Elimination of V1. absurd1 :: V1 x -> a -- | A helper for better type inference. from' :: Generic a => a -> Rep a () -- | A helper for better type inference. to' :: Generic a => Rep a () -> a -- | Lift binary combinators generically. liftG2 :: Generic1 f => (Rep1 f a -> Rep1 f b -> Rep1 f c) -> f a -> f b -> f c -- | Generic deriving for standard classes in base module Generic.Data.Internal.Prelude -- | Generic (==). -- --
-- instance Eq MyType where -- (==) = geq --geq :: (Generic a, Eq (Rep a ())) => a -> a -> Bool -- | Generic compare. -- --
-- instance Ord MyType where -- compare = gcompare --gcompare :: (Generic a, Ord (Rep a ())) => a -> a -> Ordering -- | Generic (<>) (or mappend). -- --
-- instance Semigroup MyType where -- (<>) = gmappend ---- -- See also gmempty. gmappend :: (Generic a, Semigroup (Rep a ())) => a -> a -> a -- | Generic mempty. -- --
-- instance Monoid MyType where -- mempty = gmempty --gmempty :: (Generic a, Monoid (Rep a ())) => a -- | Generic (<>) (or mappend). -- -- The difference from gmappend is the Monoid constraint -- instead of Semigroup, for older versions of base where -- Semigroup is not a superclass of Monoid. gmappend' :: (Generic a, Monoid (Rep a ())) => a -> a -> a -- | Generic fmap. -- --
-- instance Functor MyTypeF where -- fmap = gfmap --gfmap :: (Generic1 f, Functor (Rep1 f)) => (a -> b) -> f a -> f b -- | Generic (<$). -- -- See also gfmap. gconstmap :: (Generic1 f, Functor (Rep1 f)) => a -> f b -> f a -- | Generic pure. -- --
-- instance Applicative MyTypeF where -- pure = gpure -- (<*>) = gap --gpure :: (Generic1 f, Applicative (Rep1 f)) => a -> f a -- | Generic (<*>) (or ap). -- -- See also gpure. gap :: (Generic1 f, Applicative (Rep1 f)) => f (a -> b) -> f a -> f b -- | Generic liftA2. -- -- See also gpure. gliftA2 :: (Generic1 f, Applicative (Rep1 f)) => (a -> b -> c) -> f a -> f b -> f c -- | Generic empty. -- --
-- instance Alternative MyTypeF where -- empty = gempty -- (<|>) = galt --gempty :: (Generic1 f, Alternative (Rep1 f)) => f a -- | Generic (<|>). -- -- See also gempty. galt :: (Generic1 f, Alternative (Rep1 f)) => f a -> f a -> f a -- | Generic foldMap. -- --
-- instance Foldable MyTypeF where -- foldMap = gfoldMap --gfoldMap :: (Generic1 f, Foldable (Rep1 f), Monoid m) => (a -> m) -> f a -> m -- | Generic foldr. -- --
-- instance Foldable MyTypeF where -- foldr = gfoldr ---- -- See also gfoldMap. gfoldr :: (Generic1 f, Foldable (Rep1 f)) => (a -> b -> b) -> b -> f a -> b -- | Generic traverse. -- --
-- instance Traversable MyTypeF where -- traverse = gtraverse --gtraverse :: (Generic1 f, Traversable (Rep1 f), Applicative m) => (a -> m b) -> f a -> m (f b) -- | Generic sequenceA. -- --
-- instance Traversable MyTypeF where -- sequenceA = gsequenceA ---- -- See also gtraverse. gsequenceA :: (Generic1 f, Traversable (Rep1 f), Applicative m) => f (m a) -> m (f a) -- | Generic liftEq. gliftEq :: (Generic1 f, Eq1 (Rep1 f)) => (a -> b -> Bool) -> f a -> f b -> Bool -- | Generic liftCompare. gliftCompare :: (Generic1 f, Ord1 (Rep1 f)) => (a -> b -> Ordering) -> f a -> f b -> Ordering -- | Newtypes with instances implemented using generic combinators. module Generic.Data.Internal.Generically -- | Type with instances derived via Generic. newtype Generically a Generically :: a -> Generically a [unGenerically] :: Generically a -> a -- | Type with Enum instance derived via Generic with -- FiniteEnum option. newtype FiniteEnumeration a FiniteEnumeration :: a -> FiniteEnumeration a [unFiniteEnumeration] :: FiniteEnumeration a -> a -- | Type with instances derived via Generic1. newtype Generically1 f a Generically1 :: f a -> Generically1 f a [unGenerically1] :: Generically1 f a -> f a instance GHC.Generics.Generic (f a) => GHC.Generics.Generic (Generic.Data.Internal.Generically.Generically1 f a) instance GHC.Generics.Generic1 f => GHC.Generics.Generic1 (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Data.Functor.Classes.Eq1 (GHC.Generics.Rep1 f)) => Data.Functor.Classes.Eq1 (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Data.Functor.Classes.Eq1 (GHC.Generics.Rep1 f), GHC.Classes.Eq a) => GHC.Classes.Eq (Generic.Data.Internal.Generically.Generically1 f a) instance (GHC.Generics.Generic1 f, Data.Functor.Classes.Ord1 (GHC.Generics.Rep1 f)) => Data.Functor.Classes.Ord1 (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Data.Functor.Classes.Ord1 (GHC.Generics.Rep1 f), GHC.Classes.Ord a) => GHC.Classes.Ord (Generic.Data.Internal.Generically.Generically1 f a) instance (GHC.Generics.Generic1 f, Generic.Data.Internal.Show.GShow1 (GHC.Generics.Rep1 f)) => Data.Functor.Classes.Show1 (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Generic.Data.Internal.Show.GShow1 (GHC.Generics.Rep1 f), GHC.Show.Show a) => GHC.Show.Show (Generic.Data.Internal.Generically.Generically1 f a) instance (GHC.Generics.Generic1 f, GHC.Base.Functor (GHC.Generics.Rep1 f)) => GHC.Base.Functor (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, GHC.Base.Applicative (GHC.Generics.Rep1 f)) => GHC.Base.Applicative (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, GHC.Base.Alternative (GHC.Generics.Rep1 f)) => GHC.Base.Alternative (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Data.Foldable.Foldable (GHC.Generics.Rep1 f)) => Data.Foldable.Foldable (Generic.Data.Internal.Generically.Generically1 f) instance (GHC.Generics.Generic1 f, Data.Traversable.Traversable (GHC.Generics.Rep1 f)) => Data.Traversable.Traversable (Generic.Data.Internal.Generically.Generically1 f) instance GHC.Generics.Generic a => GHC.Generics.Generic (Generic.Data.Internal.Generically.FiniteEnumeration a) instance (GHC.Generics.Generic a, Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.FiniteEnum (GHC.Generics.Rep a)) => GHC.Enum.Enum (Generic.Data.Internal.Generically.FiniteEnumeration a) instance GHC.Generics.Generic a => GHC.Generics.Generic (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, GHC.Classes.Eq (GHC.Generics.Rep a ())) => GHC.Classes.Eq (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, GHC.Classes.Ord (GHC.Generics.Rep a ())) => GHC.Classes.Ord (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, Generic.Data.Internal.Show.GShow0 (GHC.Generics.Rep a)) => GHC.Show.Show (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, GHC.Base.Semigroup (GHC.Generics.Rep a ())) => GHC.Base.Semigroup (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, GHC.Base.Monoid (GHC.Generics.Rep a ())) => GHC.Base.Monoid (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.StandardEnum (GHC.Generics.Rep a)) => GHC.Enum.Enum (Generic.Data.Internal.Generically.Generically a) instance (GHC.Generics.Generic a, Generic.Data.Internal.Enum.GBounded (GHC.Generics.Rep a)) => GHC.Enum.Bounded (Generic.Data.Internal.Generically.Generically a) -- | Generic combinators to derive type class instances. -- -- base classes that GHC can not derive instances for, as of -- version 8.2: -- --
-- instance Semigroup MyType where -- (<>) = gmappend ---- -- See also gmempty. gmappend :: (Generic a, Semigroup (Rep a ())) => a -> a -> a -- | Generic mempty. -- --
-- instance Monoid MyType where -- mempty = gmempty --gmempty :: (Generic a, Monoid (Rep a ())) => a -- | Generic (<>) (or mappend). -- -- The difference from gmappend is the Monoid constraint -- instead of Semigroup, for older versions of base where -- Semigroup is not a superclass of Monoid. gmappend' :: (Generic a, Monoid (Rep a ())) => a -> a -> a -- | Generic (==). -- --
-- instance Eq MyType where -- (==) = geq --geq :: (Generic a, Eq (Rep a ())) => a -> a -> Bool -- | Generic compare. -- --
-- instance Ord MyType where -- compare = gcompare --gcompare :: (Generic a, Ord (Rep a ())) => a -> a -> Ordering -- | Generic showsPrec. -- --
-- instance Show MyType where -- showsPrec = gshowsPrec --gshowsPrec :: (Generic a, GShow0 (Rep a)) => Int -> a -> ShowS -- | Generic representation of Show types. type GShow0 = GShow Proxy -- | Generic representation of Enum types. -- -- The opts parameter is a type-level option to select different -- implementations. class GEnum opts f -- | Standard option for GEnum: derive Enum for types with -- only nullary constructors (the same restrictions as in the Haskell -- 2010 report). data StandardEnum -- | Generic toEnum generated with the StandardEnum option. -- --
-- instance Enum MyType where -- toEnum = gtoEnum -- fromEnum = gfromEnum -- enumFrom = genumFrom -- enumFromThen = genumFromThen -- enumFromTo = genumFromTo -- enumFromThenTo = genumFromThenTo --gtoEnum :: forall a. (Generic a, GEnum StandardEnum (Rep a)) => Int -> a -- | Generic fromEnum generated with the StandardEnum option. -- -- See also gtoEnum. gfromEnum :: (Generic a, GEnum StandardEnum (Rep a)) => a -> Int -- | Generic enumFrom generated with the StandardEnum option. -- -- See also gtoEnum. genumFrom :: (Generic a, GEnum StandardEnum (Rep a)) => a -> [a] -- | Generic enumFromThen generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromThen :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromTo generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromTo :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromThenTo generated with the StandardEnum -- option. -- -- See also gtoEnum. genumFromThenTo :: (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> a -> [a] -- | Extends the StandardEnum option for GEnum to allow all -- constructors to have arbitrary many fields. Each field type must be an -- instance of both Enum and Bounded. Two restrictions -- require the user's caution: -- --
-- data Example = C0 Bool Bool | C1 Bool -- deriving (Eq, Ord, Show, Generic) -- -- cardinality = 6 -- 2 * 2 + 2 -- -- Bool * Bool | Bool -- -- enumeration = -- [ C0 False False -- , C0 False True -- , C0 True False -- , C0 True True -- , C1 False -- , C1 True -- ] -- -- enumeration == map gtoFiniteEnum [0 .. 5] -- [0 .. 5] == map gfromFiniteEnum enumeration --data FiniteEnum -- | Generic toEnum generated with the FiniteEnum option. -- --
-- instance Enum MyType where -- toEnum = gtoFiniteEnum -- fromEnum = gfromFiniteEnum -- enumFrom = gfiniteEnumFrom -- enumFromThen = gfiniteEnumFromThen -- enumFromTo = gfiniteEnumFromTo -- enumFromThenTo = gfiniteEnumFromThenTo --gtoFiniteEnum :: forall a. (Generic a, GEnum FiniteEnum (Rep a)) => Int -> a -- | Generic fromEnum generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfromFiniteEnum :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> Int -- | Generic enumFrom generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfiniteEnumFrom :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> [a] -- | Generic enumFromThen generated with the FiniteEnum -- option. -- -- See also gtoFiniteEnum. gfiniteEnumFromThen :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromTo generated with the FiniteEnum option. -- -- See also gtoFiniteEnum. gfiniteEnumFromTo :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a] -- | Generic enumFromThenTo generated with the FiniteEnum -- option. -- -- See also gtoFiniteEnum. gfiniteEnumFromThenTo :: (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> a -> [a] -- | Generic minBound. -- --
-- instance Bounded MyType where -- minBound = gminBound -- maxBound = gmaxBound --gminBound :: (Generic a, GBounded (Rep a)) => a -- | Generic maxBound. -- -- See also gminBound. gmaxBound :: (Generic a, GBounded (Rep a)) => a -- | Generic representation of Bounded types. class GBounded f -- | Generic fmap. -- --
-- instance Functor MyTypeF where -- fmap = gfmap --gfmap :: (Generic1 f, Functor (Rep1 f)) => (a -> b) -> f a -> f b -- | Generic (<$). -- -- See also gfmap. gconstmap :: (Generic1 f, Functor (Rep1 f)) => a -> f b -> f a -- | Generic foldMap. -- --
-- instance Foldable MyTypeF where -- foldMap = gfoldMap --gfoldMap :: (Generic1 f, Foldable (Rep1 f), Monoid m) => (a -> m) -> f a -> m -- | Generic foldr. -- --
-- instance Foldable MyTypeF where -- foldr = gfoldr ---- -- See also gfoldMap. gfoldr :: (Generic1 f, Foldable (Rep1 f)) => (a -> b -> b) -> b -> f a -> b -- | Generic traverse. -- --
-- instance Traversable MyTypeF where -- traverse = gtraverse --gtraverse :: (Generic1 f, Traversable (Rep1 f), Applicative m) => (a -> m b) -> f a -> m (f b) -- | Generic sequenceA. -- --
-- instance Traversable MyTypeF where -- sequenceA = gsequenceA ---- -- See also gtraverse. gsequenceA :: (Generic1 f, Traversable (Rep1 f), Applicative m) => f (m a) -> m (f a) -- | Generic pure. -- --
-- instance Applicative MyTypeF where -- pure = gpure -- (<*>) = gap --gpure :: (Generic1 f, Applicative (Rep1 f)) => a -> f a -- | Generic (<*>) (or ap). -- -- See also gpure. gap :: (Generic1 f, Applicative (Rep1 f)) => f (a -> b) -> f a -> f b -- | Generic liftA2. -- -- See also gpure. gliftA2 :: (Generic1 f, Applicative (Rep1 f)) => (a -> b -> c) -> f a -> f b -> f c -- | Generic empty. -- --
-- instance Alternative MyTypeF where -- empty = gempty -- (<|>) = galt --gempty :: (Generic1 f, Alternative (Rep1 f)) => f a -- | Generic (<|>). -- -- See also gempty. galt :: (Generic1 f, Alternative (Rep1 f)) => f a -> f a -> f a -- | Generic liftEq. gliftEq :: (Generic1 f, Eq1 (Rep1 f)) => (a -> b -> Bool) -> f a -> f b -> Bool -- | Generic liftCompare. gliftCompare :: (Generic1 f, Ord1 (Rep1 f)) => (a -> b -> Ordering) -> f a -> f b -> Ordering -- | Generic liftShowsPrec. gliftShowsPrec :: (Generic1 f, GShow1 (Rep1 f)) => (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS -- | Generic representation of Show1 types. type GShow1 = GShow Identity -- | A newtype whose instances for simple classes (Eq, Ord, -- Read, Show) use higher-kinded class instances for -- f (Eq1, Ord1, Read1, Show1). newtype Id1 f a Id1 :: f a -> Id1 f a [unId1] :: Id1 f a -> f a -- | A newtype with trivial instances, that considers every value -- equivalent to every other one, and shows as just "_". newtype Opaque a Opaque :: a -> Opaque a [unOpaque] :: Opaque a -> a -- | A higher-kinded version of Opaque. newtype Opaque1 f a Opaque1 :: f a -> Opaque1 f a [unOpaque1] :: Opaque1 f a -> f a -- | Type with instances derived via Generic. newtype Generically a Generically :: a -> Generically a [unGenerically] :: Generically a -> a -- | Type with Enum instance derived via Generic with -- FiniteEnum option. newtype FiniteEnumeration a FiniteEnumeration :: a -> FiniteEnumeration a [unFiniteEnumeration] :: FiniteEnumeration a -> a -- | Type with instances derived via Generic1. newtype Generically1 f a Generically1 :: f a -> Generically1 f a [unGenerically1] :: Generically1 f a -> f a -- | Class of newtypes. There is an instance Newtype a if -- and only if a is a newtype and an instance of Generic. class (Generic a, Coercible a (Old a), Newtype' a) => Newtype a -- | Generic newtype constructor. pack :: Newtype a => Old a -> a -- | Generic newtype destructor. unpack :: Newtype a => a -> Old a -- | Name of the first data constructor in a type as a string. -- --
-- gdatatypeName @(Maybe AnyType) = "Maybe" --gdatatypeName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the module where the first type constructor is defined. -- --
-- gmoduleName @(Maybe AnyType) = "GHC.Base" --gmoduleName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the package where the first type constructor is defined. -- --
-- gpackageName @(Maybe AnyType) = "base" --gpackageName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | True if the first type constructor is a newtype. gisNewtype :: forall a. (Generic a, GDatatype (Rep a)) => Bool -- | Generic representations that contain datatype metadata. class GDatatype f -- | Name of the first constructor in a value. -- --
-- gconName (Just 0) = "Just" --gconName :: forall a. Constructors a => a -> String -- | The fixity of the first constructor. -- --
-- gconFixity (Just 0) = Prefix -- gconFixity ([] :*: id) = Infix RightAssociative 6 --gconFixity :: forall a. Constructors a => a -> Fixity -- | True if the constructor is a record. -- --
-- gconIsRecord (Just 0) = False
-- gconIsRecord (Sum 0) = True
-- -- newtype Sum a = Sum { getSum :: a }
--
gconIsRecord :: forall a. Constructors a => a -> Bool
-- | Number of constructors.
--
-- -- gconNum @(Maybe AnyType) = 2 --gconNum :: forall a. Constructors a => Int -- | Index of a constructor. -- --
-- gconIndex Nothing = 0 -- gconIndex (Just "test") = 1 --gconIndex :: forall a. Constructors a => a -> Int -- | Constraint synonym for Generic and GConstructors. class (Generic a, GConstructors (Rep a)) => Constructors a -- | Generic representations that contain constructor metadata. class GConstructors r -- | An opaque identifier for a constructor. data ConId a -- | Identifier of a constructor. conId :: forall a. Constructors a => a -> ConId a -- | Index of a constructor, given its identifier. See also -- gconIndex. conIdToInt :: forall a. ConId a -> Int -- | Name of a constructor. See also gconName. conIdToString :: forall a. Constructors a => ConId a -> String -- | All constructor identifiers. -- --
-- gconNum @a = length (conIdEnum @a) --conIdEnum :: forall a. Constructors a => [ConId a] -- | Meta field of the M1 type constructor. type family MetaOf (f :: * -> *) :: Meta -- | Name of the data type (MetaData). type family MetaDataName (m :: Meta) :: Symbol -- | Name of the module where the data type is defined (MetaData) type family MetaDataModule (m :: Meta) :: Symbol -- | Name of the package where the data type is defined (MetaData) type family MetaDataPackage (m :: Meta) :: Symbol -- | True if the data type is a newtype (MetaData). type family MetaDataNewtype (m :: Meta) :: Bool -- | Name of the constructor (MetaCons). type family MetaConsName (m :: Meta) :: Symbol -- | Fixity of the constructor (MetaCons). type family MetaConsFixity (m :: Meta) :: FixityI -- | True for a record constructor (MetaCons). type family MetaConsRecord (m :: Meta) :: Bool -- | Just the name of the record field, if it is one -- (MetaSel). type family MetaSelNameM (m :: Meta) :: Maybe Symbol -- | Name of the record field; undefined for non-record fields -- (MetaSel). type family MetaSelName (m :: Meta) :: Symbol -- | Unpackedness annotation of a field (MetaSel). type family MetaSelUnpack (m :: Meta) :: SourceUnpackedness -- | Strictness annotation of a field (MetaSel). type family MetaSelSourceStrictness (m :: Meta) :: SourceStrictness -- | Inferred strictness of a field (MetaSel). type family MetaSelStrictness (m :: Meta) :: DecidedStrictness -- | Orphan instances. They should probably be upstreamed. module Generic.Data.Orphans instance Data.Functor.Classes.Eq1 f => Data.Functor.Classes.Eq1 (GHC.Generics.M1 i c f) instance Data.Functor.Classes.Ord1 f => Data.Functor.Classes.Ord1 (GHC.Generics.M1 i c f) instance Data.Functor.Classes.Eq1 GHC.Generics.V1 instance Data.Functor.Classes.Ord1 GHC.Generics.V1 instance Data.Functor.Classes.Eq1 GHC.Generics.U1 instance Data.Functor.Classes.Ord1 GHC.Generics.U1 instance GHC.Classes.Eq c => Data.Functor.Classes.Eq1 (GHC.Generics.K1 i c) instance GHC.Classes.Ord c => Data.Functor.Classes.Ord1 (GHC.Generics.K1 i c) instance (Data.Functor.Classes.Eq1 f, Data.Functor.Classes.Eq1 g) => Data.Functor.Classes.Eq1 (f GHC.Generics.:*: g) instance (Data.Functor.Classes.Ord1 f, Data.Functor.Classes.Ord1 g) => Data.Functor.Classes.Ord1 (f GHC.Generics.:*: g) instance (Data.Functor.Classes.Eq1 f, Data.Functor.Classes.Eq1 g) => Data.Functor.Classes.Eq1 (f GHC.Generics.:+: g) instance (Data.Functor.Classes.Ord1 f, Data.Functor.Classes.Ord1 g) => Data.Functor.Classes.Ord1 (f GHC.Generics.:+: g) instance Data.Functor.Classes.Eq1 f => Data.Functor.Classes.Eq1 (GHC.Generics.Rec1 f) instance Data.Functor.Classes.Ord1 f => Data.Functor.Classes.Ord1 (GHC.Generics.Rec1 f) instance Data.Functor.Classes.Eq1 GHC.Generics.Par1 instance Data.Functor.Classes.Ord1 GHC.Generics.Par1 instance (Data.Functor.Classes.Eq1 f, Data.Functor.Classes.Eq1 g) => Data.Functor.Classes.Eq1 (f GHC.Generics.:.: g) instance (Data.Functor.Classes.Ord1 f, Data.Functor.Classes.Ord1 g) => Data.Functor.Classes.Ord1 (f GHC.Generics.:.: g) -- | Utilities to derive and transform generic types. module Generic.Data.Types -- | Synthetic data type. -- -- A wrapper to view a generic Rep as the datatype it's supposed -- to represent, without needing a declaration. newtype Data r p Data :: r p -> Data r p [unData] :: Data r p -> r p -- | Conversion between a generic type and the synthetic type made using -- its representation. toData :: Generic a => a -> Data (Rep a) p -- | Inverse of fromData. fromData :: Generic a => Data (Rep a) p -> a -- | Surgeries that are just coerce. module Generic.Data.Internal.Microsurgery -- | Apply a microsurgery s to a type a for -- DerivingVia. -- --
-- {-# 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 Surgery (s :: *) (a :: *) = Generically (Surgery' s a)
-- | See Surgery'.
newtype Surgery' (s :: *) (a :: *)
Surgery' :: a -> Surgery'
[unSurgery'] :: Surgery' -> a
-- | Apply a microsurgery represented by a symbol s (declared as a
-- dummy data type) to a generic representation f.
type family GSurgery (s :: *) (f :: k -> *) :: k -> *
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
-- | 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, to be applied using
-- GSurgery.
data Derecordify :: *
type family GDerecordify (f :: k -> *) :: k -> *
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
-- | Forget that a type is a newtype. (The pun is that "aging" a
-- type makes it no longer "new".)
--
-- -- newtype Foo = Bar Baz -- -- -- becomes -- -- -- data Foo = Bar Baz ---- -- This is a defunctionalized symbol, to be applied using -- GSurgery. data Typeage :: * 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 -- | 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, to be applied using
-- GSurgery.
data RenameFields (rnm :: *) :: *
type family GRenameFields (rnm :: *) (f :: k -> *) :: k -> *
-- | 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, to be applied using
-- GSurgery.
data RenameConstrs (rnm :: *) :: *
type family GRenameConstrs (rnm :: *) (f :: k -> *) :: k -> *
-- | 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" --type family (f :: *) @@ (s :: Symbol) :: Symbol -- | Identity function Symbol -> Symbol. data SId -- | Empty function (compile-time error when applied). data SError -- | Constant function. data SConst (s :: Symbol) -- | Define a function for a fixed set of strings, and fall back to -- f for the others. data SRename (xs :: [(Symbol, Symbol)]) (f :: *) -- | Closed type family for SRename. type family SRename' (xs :: [(Symbol, Symbol)]) (f :: *) (s :: Symbol) -- | Unify the "spines" of two generic representations (the "spine" is -- everything except the field types). class UnifyRep (f :: k -> *) (g :: k -> *) -- |
-- 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). onData :: (UnifyRep r s, UnifyRep s r) => p (Data r x) (Data s y) -> p (Data r x) (Data s y) -- | Apply a type constructor f to every field type of a generic -- representation r. -- -- This is a defunctionalized symbol, to be applied using -- GSurgery. data OnFields (f :: * -> *) :: * type family GOnFields (f :: * -> *) (g :: k -> *) :: k -> * -- | Apply a type constructor to every field type of a type a to -- make a synthetic type. type DOnFields (f :: * -> *) (a :: *) = Data (GSurgery (OnFields f) (Rep a)) () instance forall k (g' :: k -> *) s (c :: GHC.Generics.Meta) (g :: k -> *) (f :: k -> *). (g' Data.Type.Equality.~ GHC.Generics.M1 s c g, Generic.Data.Internal.Microsurgery.UnifyRep f g) => Generic.Data.Internal.Microsurgery.UnifyRep (GHC.Generics.M1 s c f) g' instance forall k (g' :: k -> *) (g1 :: k -> *) (g2 :: k -> *) (f1 :: k -> *) (f2 :: k -> *). (g' Data.Type.Equality.~ (g1 GHC.Generics.:+: g2), Generic.Data.Internal.Microsurgery.UnifyRep f1 g1, Generic.Data.Internal.Microsurgery.UnifyRep f2 g2) => Generic.Data.Internal.Microsurgery.UnifyRep (f1 GHC.Generics.:+: f2) g' instance forall k (g' :: k -> *) (g1 :: k -> *) (g2 :: k -> *) (f1 :: k -> *) (f2 :: k -> *). (g' Data.Type.Equality.~ (g1 GHC.Generics.:*: g2), Generic.Data.Internal.Microsurgery.UnifyRep f1 g1, Generic.Data.Internal.Microsurgery.UnifyRep f2 g2) => Generic.Data.Internal.Microsurgery.UnifyRep (f1 GHC.Generics.:*: f2) g' instance forall k (g' :: k -> *) i b a. (g' Data.Type.Equality.~ GHC.Generics.K1 i b) => Generic.Data.Internal.Microsurgery.UnifyRep (GHC.Generics.K1 i a) g' instance forall k (g' :: k -> *). (g' Data.Type.Equality.~ GHC.Generics.U1) => Generic.Data.Internal.Microsurgery.UnifyRep GHC.Generics.U1 g' instance forall k (g' :: k -> *). (g' Data.Type.Equality.~ GHC.Generics.V1) => Generic.Data.Internal.Microsurgery.UnifyRep GHC.Generics.V1 g' instance (GHC.Generics.Generic a, GHC.Types.Coercible (Generic.Data.Internal.Microsurgery.GSurgery s (GHC.Generics.Rep a)) (GHC.Generics.Rep a)) => GHC.Generics.Generic (Generic.Data.Internal.Microsurgery.Surgery' s a) -- | Simple operations on generic representations, that only change the -- type-level metadata used by certain generic functions. -- -- More complex ones can be found in generic-data-surgery but -- also, perhaps surprisingly, in generic-lens (read more about -- this just below) and one-liner. module Generic.Data.Microsurgery -- | Apply a microsurgery s to a type a for -- DerivingVia. -- --
-- {-# 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 Surgery (s :: *) (a :: *) = Generically (Surgery' s a)
-- | See Surgery'.
newtype Surgery' (s :: *) (a :: *)
Surgery' :: a -> Surgery'
[unSurgery'] :: Surgery' -> a
-- | Apply a microsurgery represented by a symbol s (declared as a
-- dummy data type) to a generic representation f.
type family GSurgery (s :: *) (f :: k -> *) :: k -> *
-- | Type with instances derived via Generic.
newtype Generically a
Generically :: a -> Generically a
[unGenerically] :: Generically a -> a
-- | Synthetic data type.
--
-- A wrapper to view a generic Rep as the datatype it's supposed
-- to represent, without needing a declaration.
data Data r p
-- | Conversion between a generic type and the synthetic type made using
-- its representation.
toData :: Generic a => a -> Data (Rep a) p
-- | Inverse of fromData.
fromData :: Generic a => Data (Rep a) p -> a
-- | -- 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). onData :: (UnifyRep r s, UnifyRep s r) => p (Data r x) (Data s y) -> p (Data r x) (Data s y) -- | 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, to be applied using
-- GSurgery.
data Derecordify :: *
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
-- | Forget that a type is a newtype. (The pun is that "aging" a
-- type makes it no longer "new".)
--
-- -- newtype Foo = Bar Baz -- -- -- becomes -- -- -- data Foo = Bar Baz ---- -- This is a defunctionalized symbol, to be applied using -- GSurgery. data Typeage :: * 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 -- | 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, to be applied using
-- GSurgery.
data RenameFields (rnm :: *) :: *
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
-- | 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, to be applied using
-- GSurgery.
data RenameConstrs (rnm :: *) :: *
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
-- | 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" --type family (f :: *) @@ (s :: Symbol) :: Symbol -- | Identity function Symbol -> Symbol. data SId -- | Empty function (compile-time error when applied). data SError -- | Constant function. data SConst (s :: Symbol) -- | Define a function for a fixed set of strings, and fall back to -- f for the others. data SRename (xs :: [(Symbol, Symbol)]) (f :: *) -- | Apply a type constructor f to every field type of a generic -- representation r. -- -- This is a defunctionalized symbol, to be applied using -- GSurgery. data OnFields (f :: * -> *) :: * -- | Apply a type constructor to every field type of a type a to -- make a synthetic type. type DOnFields (f :: * -> *) (a :: *) = Data (GSurgery (OnFields f) (Rep a)) ()