-- 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.8.1.0 -- | Shim for backwards compatibility. -- --
-- instance Enum MyType where -- toEnum = gtoEnum -- fromEnum = gfromEnum -- enumFrom = genumFrom -- enumFromThen = genumFromThen -- enumFromTo = genumFromTo -- enumFromThenTo = genumFromThenTo --gtoEnum :: (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 :: (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 range. -- --
-- import Data.Ix -- instance Ix MyType where -- range = grange -- index = gindex -- inRange = ginRange --grange :: (Generic a, GIx (Rep a)) => (a, a) -> [a] -- | Generic index. -- -- See also grange. gindex :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Int -- | Generic unsafeIndex. -- --
-- import GHC.Arr -- instance Ix MyType where -- range = grange -- unsafeIndex = gunsafeIndex -- inRange = ginRange --gunsafeIndex :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Int -- | Generic inRange. -- -- See also grange. ginRange :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Bool -- | 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. -- --
-- 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 -- | Generic representation of Ix types. class GIx f gRange :: GIx f => (f p, f p) -> [f p] gUnsafeIndex :: GIx f => (f p, f p) -> f p -> Int gInRange :: GIx f => (f p, f p) -> f p -> Bool instance Generic.Data.Internal.Enum.GBounded f => Generic.Data.Internal.Enum.GBounded (GHC.Generics.M1 i c f) instance Generic.Data.Internal.Enum.GIx f => Generic.Data.Internal.Enum.GIx (GHC.Generics.M1 i c f) instance (Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.StandardEnum f, Generic.Data.Internal.Enum.GEnum Generic.Data.Internal.Enum.StandardEnum g) => Generic.Data.Internal.Enum.GIx (f GHC.Generics.:+: g) instance (Generic.Data.Internal.Enum.GIx f, Generic.Data.Internal.Enum.GIx g) => Generic.Data.Internal.Enum.GIx (f GHC.Generics.:*: g) instance Generic.Data.Internal.Enum.GIx GHC.Generics.U1 instance GHC.Arr.Ix c => Generic.Data.Internal.Enum.GIx (GHC.Generics.K1 i c) 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 -- | Error messages. -- --
-- >>> :set -XDeriveGeneric -XDerivingVia
--
-- >>> import Generic.Data (Generically(..))
--
-- >>> :{
-- data AB = A | B
-- deriving stock Generic
-- deriving Semigroup via Generically AB
-- :}
-- ...
-- • Cannot derive Semigroup instance for AB due to sum type
-- • When deriving the instance for (Semigroup AB)
--
type AssertNoSum (constraint :: * -> Constraint) a = Assert (Not (HasSum (Rep a))) ( 'Text "Cannot derive " :<>: 'ShowType constraint :<>: 'Text " instance for " :<>: 'ShowType a :<>: 'Text " due to sum type")
instance Generic.Data.Internal.Error.Assert 'GHC.Types.True msg
instance ((TypeError ...) Data.Type.Equality.~ '()) => Generic.Data.Internal.Error.Assert 'GHC.Types.False msg
-- | Type-level functions on generic representations.
--
-- -- >>> gdatatypeName @(Maybe Int) -- "Maybe" --gdatatypeName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the module where the first type constructor is defined. -- --
-- >>> gmoduleName @(ZipList Int) -- "Control.Applicative" --gmoduleName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the package where the first type constructor is defined. -- --
-- >>> gpackageName @(Maybe Int) -- "base" --gpackageName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | True if the first type constructor is a newtype. -- --
-- >>> gisNewtype @[Int] -- False -- -- >>> gisNewtype @(ZipList Int) -- True --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) -- Note: newtype Sum a = Sum { getSum :: a }
-- True
--
gconIsRecord :: forall a. Constructors a => a -> Bool
-- | Number of constructors.
--
-- -- >>> gconNum @(Maybe Int) -- 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. This must not be called on an empty type. -- --
-- 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 -- | Get a ConId by name. -- --
-- >>> conIdNamed @"Nothing" :: ConId (Maybe Int) -- ConId 0 -- -- >>> conIdNamed @"Just" :: ConId (Maybe Int) -- ConId 1 --conIdNamed :: forall s a. ConIdNamed s a => ConId a -- | Constraint synonym for Generic and GConstructors. class (Generic a, GConstructors (Rep a)) => Constructors a -- | Constraint synonym for generic types a with a constructor -- named n. class (Generic a, KnownNat (ConIdNamed' n a)) => ConIdNamed n 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 type ConIdNamed' n t = GConIdNamedIf n t (GConIdNamed n (Rep t)) type GConIdNamed n f = GConIdNamed' n f 0 'Nothing type family GConIdNamed' (n :: Symbol) (f :: k -> *) (i :: Nat) (o :: Maybe Nat) :: Maybe Nat type family GConIdNamedIf (n :: Symbol) (t :: *) (o :: Maybe Nat) :: Nat -- | 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.Show.Show (Generic.Data.Internal.Meta.ConId a) 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, GHC.TypeNats.KnownNat (Generic.Data.Internal.Meta.ConIdNamed' n a)) => Generic.Data.Internal.Meta.ConIdNamed n 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. -- --
-- 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
-- | Newtypes with special instances for deriving.
--
-- -- 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 (Data.Functor.Classes.Show1 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. -- --
-- 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. -- --
-- >>> :set -XDeriveGeneric -XDerivingVia
--
-- >>> data Point a = Point a a deriving Generic
--
-- >>> :{
-- newtype Vector a = Vector (Point a)
-- deriving (Semigroup, Monoid)
-- via GenericProduct (Point (Sum a))
-- :}
--
--
-- If it were via Generically (Point (Sum a)) instead,
-- then Vector's mappend (the Monoid method) would
-- be defined as Point's (<>) (the
-- Semigroup method), which might not exist, or might not be
-- equivalent to Vector's generic Semigroup instance,
-- which would be unlawful.
newtype GenericProduct a
GenericProduct :: a -> GenericProduct a
[unGenericProduct] :: GenericProduct a -> a
instance GHC.Generics.Generic a => GHC.Generics.Generic (Generic.Data.Internal.Generically.GenericProduct a)
instance (Generic.Data.Internal.Error.AssertNoSum GHC.Base.Semigroup a, GHC.Generics.Generic a, GHC.Base.Semigroup (GHC.Generics.Rep a ())) => GHC.Base.Semigroup (Generic.Data.Internal.Generically.GenericProduct a)
instance (Generic.Data.Internal.Error.AssertNoSum GHC.Base.Semigroup a, GHC.Generics.Generic a, GHC.Base.Monoid (GHC.Generics.Rep a ())) => GHC.Base.Monoid (Generic.Data.Internal.Generically.GenericProduct 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 (Generic.Data.Internal.Error.AssertNoSum GHC.Base.Semigroup a, GHC.Generics.Generic a, GHC.Base.Semigroup (GHC.Generics.Rep a ())) => GHC.Base.Semigroup (Generic.Data.Internal.Generically.Generically a)
instance (Generic.Data.Internal.Error.AssertNoSum GHC.Base.Semigroup a, GHC.Base.Semigroup a, 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, GHC.Classes.Ord (GHC.Generics.Rep a ()), Generic.Data.Internal.Enum.GIx (GHC.Generics.Rep a)) => GHC.Arr.Ix (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 :: (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. -- --
-- 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 :: (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 range. -- --
-- import Data.Ix -- instance Ix MyType where -- range = grange -- index = gindex -- inRange = ginRange --grange :: (Generic a, GIx (Rep a)) => (a, a) -> [a] -- | Generic index. -- -- See also grange. gindex :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Int -- | Generic inRange. -- -- See also grange. ginRange :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Bool -- | Generic representation of Ix types. class GIx f -- | Generic unsafeIndex. -- --
-- import GHC.Arr -- instance Ix MyType where -- range = grange -- unsafeIndex = gunsafeIndex -- inRange = ginRange --gunsafeIndex :: (Generic a, GIx (Rep a)) => (a, a) -> a -> Int -- | 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 -- | Product type with generic instances of Semigroup and -- Monoid. -- -- This is similar to Generically in most cases, but -- GenericProduct also works for types T with deriving -- via GenericProduct U, where U is a generic -- product type coercible to, but distinct from T. In -- particular, U may not have an instance of Semigroup, -- which Generically requires. -- --
-- >>> :set -XDeriveGeneric -XDerivingVia
--
-- >>> data Point a = Point a a deriving Generic
--
-- >>> :{
-- newtype Vector a = Vector (Point a)
-- deriving (Semigroup, Monoid)
-- via GenericProduct (Point (Sum a))
-- :}
--
--
-- If it were via Generically (Point (Sum a)) instead,
-- then Vector's mappend (the Monoid method) would
-- be defined as Point's (<>) (the
-- Semigroup method), which might not exist, or might not be
-- equivalent to Vector's generic Semigroup instance,
-- which would be unlawful.
newtype GenericProduct a
GenericProduct :: a -> GenericProduct a
[unGenericProduct] :: GenericProduct 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
-- | The type wrapped by a newtype.
--
--
-- newtype Foo = Foo { bar :: Bar } deriving Generic
-- -- Old Foo ~ Bar
--
type Old a = GOld (Rep a)
-- | Generic newtype constructor.
pack :: Newtype a => Old a -> a
-- | Generic newtype destructor.
unpack :: Newtype a => a -> Old a
-- | Convert between types with representationally equivalent generic
-- representations.
gcoerce :: (Generic a, Generic b, Coercible (Rep a) (Rep b)) => a -> b
-- | Compose gcoerce with a binary operation.
gcoerceBinop :: (Generic a, Generic b, Coercible (Rep a) (Rep b)) => (a -> a -> a) -> b -> b -> b
-- | Name of the first data constructor in a type as a string.
--
-- -- >>> gdatatypeName @(Maybe Int) -- "Maybe" --gdatatypeName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the module where the first type constructor is defined. -- --
-- >>> gmoduleName @(ZipList Int) -- "Control.Applicative" --gmoduleName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | Name of the package where the first type constructor is defined. -- --
-- >>> gpackageName @(Maybe Int) -- "base" --gpackageName :: forall a. (Generic a, GDatatype (Rep a)) => String -- | True if the first type constructor is a newtype. -- --
-- >>> gisNewtype @[Int] -- False -- -- >>> gisNewtype @(ZipList Int) -- True --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) -- Note: newtype Sum a = Sum { getSum :: a }
-- True
--
gconIsRecord :: forall a. Constructors a => a -> Bool
-- | Number of constructors.
--
-- -- >>> gconNum @(Maybe Int) -- 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. This must not be called on an empty type. -- --
-- gconNum @a = length (conIdEnum @a) --conIdEnum :: forall a. Constructors a => [ConId a] -- | Get a ConId by name. -- --
-- >>> conIdNamed @"Nothing" :: ConId (Maybe Int) -- ConId 0 -- -- >>> conIdNamed @"Just" :: ConId (Maybe Int) -- ConId 1 --conIdNamed :: forall s a. ConIdNamed s a => ConId a -- | Constraint synonym for generic types a with a constructor -- named n. class (Generic a, KnownNat (ConIdNamed' n a)) => ConIdNamed n 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. Inverse of fromData. toData :: Generic a => a -> Data (Rep a) p -- | Inverse of toData. fromData :: Generic a => Data (Rep a) p -> a -- | Surgeries that are just coerce. -- --
-- {-# 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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or -- Surgery. 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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or -- Surgery. 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. Inverse of fromData.
toData :: Generic a => a -> Data (Rep a) p
-- | Inverse of toData.
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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or -- Surgery. 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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or
-- Surgery.
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, applied using GSurgery or -- Surgery. 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)) ()