{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-}
module Generics.SOP.Metadata
( module Generics.SOP.Metadata
, Associativity(..)
, DecidedStrictness(..)
, SourceStrictness(..)
, SourceUnpackedness(..)
) where
import Data.Kind (Type)
import GHC.Generics
( Associativity(..)
, DecidedStrictness(..)
, SourceStrictness(..)
, SourceUnpackedness(..)
)
import Generics.SOP.Constraint
import Generics.SOP.NP
data DatatypeInfo :: [[Type]] -> Type where
ADT ::
ModuleName
-> DatatypeName
-> NP ConstructorInfo xss
-> POP StrictnessInfo xss
-> DatatypeInfo xss
Newtype ::
ModuleName
-> DatatypeName
-> ConstructorInfo '[x]
-> DatatypeInfo '[ '[x] ]
moduleName :: DatatypeInfo xss -> ModuleName
moduleName :: DatatypeInfo xss -> ModuleName
moduleName (ADT ModuleName
name ModuleName
_ NP ConstructorInfo xss
_ POP StrictnessInfo xss
_) = ModuleName
name
moduleName (Newtype ModuleName
name ModuleName
_ ConstructorInfo '[x]
_) = ModuleName
name
datatypeName :: DatatypeInfo xss -> DatatypeName
datatypeName :: DatatypeInfo xss -> ModuleName
datatypeName (ADT ModuleName
_ ModuleName
name NP ConstructorInfo xss
_ POP StrictnessInfo xss
_) = ModuleName
name
datatypeName (Newtype ModuleName
_ ModuleName
name ConstructorInfo '[x]
_) = ModuleName
name
constructorInfo :: DatatypeInfo xss -> NP ConstructorInfo xss
constructorInfo :: DatatypeInfo xss -> NP ConstructorInfo xss
constructorInfo (ADT ModuleName
_ ModuleName
_ NP ConstructorInfo xss
cs POP StrictnessInfo xss
_) = NP ConstructorInfo xss
cs
constructorInfo (Newtype ModuleName
_ ModuleName
_ ConstructorInfo '[x]
c) = ConstructorInfo '[x]
c ConstructorInfo '[x]
-> NP ConstructorInfo '[] -> NP ConstructorInfo '[ '[x]]
forall k (a :: k -> *) (x :: k) (xs :: [k]).
a x -> NP a xs -> NP a (x : xs)
:* NP ConstructorInfo '[]
forall k (a :: k -> *). NP a '[]
Nil
deriving instance
( All (Show `Compose` ConstructorInfo) xs
, All (Show `Compose` NP StrictnessInfo) xs
) => Show (DatatypeInfo xs)
deriving instance
( All (Eq `Compose` ConstructorInfo) xs
, All (Eq `Compose` NP StrictnessInfo) xs
) => Eq (DatatypeInfo xs)
deriving instance
( All (Eq `Compose` ConstructorInfo) xs
, All (Ord `Compose` ConstructorInfo) xs
, All (Eq `Compose` NP StrictnessInfo) xs
, All (Ord `Compose` NP StrictnessInfo) xs
) => Ord (DatatypeInfo xs)
data ConstructorInfo :: [Type] -> Type where
Constructor :: SListI xs => ConstructorName -> ConstructorInfo xs
Infix :: ConstructorName -> Associativity -> Fixity -> ConstructorInfo '[ x, y ]
Record :: SListI xs => ConstructorName -> NP FieldInfo xs -> ConstructorInfo xs
constructorName :: ConstructorInfo xs -> ConstructorName
constructorName :: ConstructorInfo xs -> ModuleName
constructorName (Constructor ModuleName
name) = ModuleName
name
constructorName (Infix ModuleName
name Associativity
_ Int
_) = ModuleName
name
constructorName (Record ModuleName
name NP FieldInfo xs
_) = ModuleName
name
deriving instance All (Show `Compose` FieldInfo) xs => Show (ConstructorInfo xs)
deriving instance All (Eq `Compose` FieldInfo) xs => Eq (ConstructorInfo xs)
deriving instance (All (Eq `Compose` FieldInfo) xs, All (Ord `Compose` FieldInfo) xs) => Ord (ConstructorInfo xs)
data StrictnessInfo :: Type -> Type where
StrictnessInfo ::
SourceUnpackedness
-> SourceStrictness
-> DecidedStrictness
-> StrictnessInfo a
deriving (Int -> StrictnessInfo a -> ShowS
[StrictnessInfo a] -> ShowS
StrictnessInfo a -> ModuleName
(Int -> StrictnessInfo a -> ShowS)
-> (StrictnessInfo a -> ModuleName)
-> ([StrictnessInfo a] -> ShowS)
-> Show (StrictnessInfo a)
forall a. Int -> StrictnessInfo a -> ShowS
forall a. [StrictnessInfo a] -> ShowS
forall a. StrictnessInfo a -> ModuleName
forall a.
(Int -> a -> ShowS)
-> (a -> ModuleName) -> ([a] -> ShowS) -> Show a
showList :: [StrictnessInfo a] -> ShowS
$cshowList :: forall a. [StrictnessInfo a] -> ShowS
show :: StrictnessInfo a -> ModuleName
$cshow :: forall a. StrictnessInfo a -> ModuleName
showsPrec :: Int -> StrictnessInfo a -> ShowS
$cshowsPrec :: forall a. Int -> StrictnessInfo a -> ShowS
Show, StrictnessInfo a -> StrictnessInfo a -> Bool
(StrictnessInfo a -> StrictnessInfo a -> Bool)
-> (StrictnessInfo a -> StrictnessInfo a -> Bool)
-> Eq (StrictnessInfo a)
forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c/= :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
== :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c== :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
Eq, Eq (StrictnessInfo a)
Eq (StrictnessInfo a)
-> (StrictnessInfo a -> StrictnessInfo a -> Ordering)
-> (StrictnessInfo a -> StrictnessInfo a -> Bool)
-> (StrictnessInfo a -> StrictnessInfo a -> Bool)
-> (StrictnessInfo a -> StrictnessInfo a -> Bool)
-> (StrictnessInfo a -> StrictnessInfo a -> Bool)
-> (StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a)
-> (StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a)
-> Ord (StrictnessInfo a)
StrictnessInfo a -> StrictnessInfo a -> Bool
StrictnessInfo a -> StrictnessInfo a -> Ordering
StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
forall a. Eq (StrictnessInfo a)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
forall a. StrictnessInfo a -> StrictnessInfo a -> Ordering
forall a. StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
min :: StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
$cmin :: forall a. StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
max :: StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
$cmax :: forall a. StrictnessInfo a -> StrictnessInfo a -> StrictnessInfo a
>= :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c>= :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
> :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c> :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
<= :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c<= :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
< :: StrictnessInfo a -> StrictnessInfo a -> Bool
$c< :: forall a. StrictnessInfo a -> StrictnessInfo a -> Bool
compare :: StrictnessInfo a -> StrictnessInfo a -> Ordering
$ccompare :: forall a. StrictnessInfo a -> StrictnessInfo a -> Ordering
$cp1Ord :: forall a. Eq (StrictnessInfo a)
Ord, (a -> b) -> StrictnessInfo a -> StrictnessInfo b
(forall a b. (a -> b) -> StrictnessInfo a -> StrictnessInfo b)
-> (forall a b. a -> StrictnessInfo b -> StrictnessInfo a)
-> Functor StrictnessInfo
forall a b. a -> StrictnessInfo b -> StrictnessInfo a
forall a b. (a -> b) -> StrictnessInfo a -> StrictnessInfo b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> StrictnessInfo b -> StrictnessInfo a
$c<$ :: forall a b. a -> StrictnessInfo b -> StrictnessInfo a
fmap :: (a -> b) -> StrictnessInfo a -> StrictnessInfo b
$cfmap :: forall a b. (a -> b) -> StrictnessInfo a -> StrictnessInfo b
Functor)
data FieldInfo :: Type -> Type where
FieldInfo :: FieldName -> FieldInfo a
deriving (Int -> FieldInfo a -> ShowS
[FieldInfo a] -> ShowS
FieldInfo a -> ModuleName
(Int -> FieldInfo a -> ShowS)
-> (FieldInfo a -> ModuleName)
-> ([FieldInfo a] -> ShowS)
-> Show (FieldInfo a)
forall a. Int -> FieldInfo a -> ShowS
forall a. [FieldInfo a] -> ShowS
forall a. FieldInfo a -> ModuleName
forall a.
(Int -> a -> ShowS)
-> (a -> ModuleName) -> ([a] -> ShowS) -> Show a
showList :: [FieldInfo a] -> ShowS
$cshowList :: forall a. [FieldInfo a] -> ShowS
show :: FieldInfo a -> ModuleName
$cshow :: forall a. FieldInfo a -> ModuleName
showsPrec :: Int -> FieldInfo a -> ShowS
$cshowsPrec :: forall a. Int -> FieldInfo a -> ShowS
Show, FieldInfo a -> FieldInfo a -> Bool
(FieldInfo a -> FieldInfo a -> Bool)
-> (FieldInfo a -> FieldInfo a -> Bool) -> Eq (FieldInfo a)
forall a. FieldInfo a -> FieldInfo a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FieldInfo a -> FieldInfo a -> Bool
$c/= :: forall a. FieldInfo a -> FieldInfo a -> Bool
== :: FieldInfo a -> FieldInfo a -> Bool
$c== :: forall a. FieldInfo a -> FieldInfo a -> Bool
Eq, Eq (FieldInfo a)
Eq (FieldInfo a)
-> (FieldInfo a -> FieldInfo a -> Ordering)
-> (FieldInfo a -> FieldInfo a -> Bool)
-> (FieldInfo a -> FieldInfo a -> Bool)
-> (FieldInfo a -> FieldInfo a -> Bool)
-> (FieldInfo a -> FieldInfo a -> Bool)
-> (FieldInfo a -> FieldInfo a -> FieldInfo a)
-> (FieldInfo a -> FieldInfo a -> FieldInfo a)
-> Ord (FieldInfo a)
FieldInfo a -> FieldInfo a -> Bool
FieldInfo a -> FieldInfo a -> Ordering
FieldInfo a -> FieldInfo a -> FieldInfo a
forall a. Eq (FieldInfo a)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. FieldInfo a -> FieldInfo a -> Bool
forall a. FieldInfo a -> FieldInfo a -> Ordering
forall a. FieldInfo a -> FieldInfo a -> FieldInfo a
min :: FieldInfo a -> FieldInfo a -> FieldInfo a
$cmin :: forall a. FieldInfo a -> FieldInfo a -> FieldInfo a
max :: FieldInfo a -> FieldInfo a -> FieldInfo a
$cmax :: forall a. FieldInfo a -> FieldInfo a -> FieldInfo a
>= :: FieldInfo a -> FieldInfo a -> Bool
$c>= :: forall a. FieldInfo a -> FieldInfo a -> Bool
> :: FieldInfo a -> FieldInfo a -> Bool
$c> :: forall a. FieldInfo a -> FieldInfo a -> Bool
<= :: FieldInfo a -> FieldInfo a -> Bool
$c<= :: forall a. FieldInfo a -> FieldInfo a -> Bool
< :: FieldInfo a -> FieldInfo a -> Bool
$c< :: forall a. FieldInfo a -> FieldInfo a -> Bool
compare :: FieldInfo a -> FieldInfo a -> Ordering
$ccompare :: forall a. FieldInfo a -> FieldInfo a -> Ordering
$cp1Ord :: forall a. Eq (FieldInfo a)
Ord, (a -> b) -> FieldInfo a -> FieldInfo b
(forall a b. (a -> b) -> FieldInfo a -> FieldInfo b)
-> (forall a b. a -> FieldInfo b -> FieldInfo a)
-> Functor FieldInfo
forall a b. a -> FieldInfo b -> FieldInfo a
forall a b. (a -> b) -> FieldInfo a -> FieldInfo b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> FieldInfo b -> FieldInfo a
$c<$ :: forall a b. a -> FieldInfo b -> FieldInfo a
fmap :: (a -> b) -> FieldInfo a -> FieldInfo b
$cfmap :: forall a b. (a -> b) -> FieldInfo a -> FieldInfo b
Functor)
fieldName :: FieldInfo a -> FieldName
fieldName :: FieldInfo a -> ModuleName
fieldName (FieldInfo ModuleName
n) = ModuleName
n
type DatatypeName = String
type ModuleName = String
type ConstructorName = String
type FieldName = String
type Fixity = Int