{-|
High-level model of schema.
-}
module DomainCore.Model
where

import DomainCore.Prelude


{-|
Declaration of a type.
-}
data TypeDec =
  {-|
  Name of the type and its definition.
  -}
  TypeDec Text TypeDef
  deriving ((forall x. TypeDec -> Rep TypeDec x)
-> (forall x. Rep TypeDec x -> TypeDec) -> Generic TypeDec
forall x. Rep TypeDec x -> TypeDec
forall x. TypeDec -> Rep TypeDec x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TypeDec x -> TypeDec
$cfrom :: forall x. TypeDec -> Rep TypeDec x
Generic, Int -> TypeDec -> ShowS
[TypeDec] -> ShowS
TypeDec -> String
(Int -> TypeDec -> ShowS)
-> (TypeDec -> String) -> ([TypeDec] -> ShowS) -> Show TypeDec
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TypeDec] -> ShowS
$cshowList :: [TypeDec] -> ShowS
show :: TypeDec -> String
$cshow :: TypeDec -> String
showsPrec :: Int -> TypeDec -> ShowS
$cshowsPrec :: Int -> TypeDec -> ShowS
Show, TypeDec -> TypeDec -> Bool
(TypeDec -> TypeDec -> Bool)
-> (TypeDec -> TypeDec -> Bool) -> Eq TypeDec
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TypeDec -> TypeDec -> Bool
$c/= :: TypeDec -> TypeDec -> Bool
== :: TypeDec -> TypeDec -> Bool
$c== :: TypeDec -> TypeDec -> Bool
Eq, Eq TypeDec
Eq TypeDec
-> (TypeDec -> TypeDec -> Ordering)
-> (TypeDec -> TypeDec -> Bool)
-> (TypeDec -> TypeDec -> Bool)
-> (TypeDec -> TypeDec -> Bool)
-> (TypeDec -> TypeDec -> Bool)
-> (TypeDec -> TypeDec -> TypeDec)
-> (TypeDec -> TypeDec -> TypeDec)
-> Ord TypeDec
TypeDec -> TypeDec -> Bool
TypeDec -> TypeDec -> Ordering
TypeDec -> TypeDec -> TypeDec
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
min :: TypeDec -> TypeDec -> TypeDec
$cmin :: TypeDec -> TypeDec -> TypeDec
max :: TypeDec -> TypeDec -> TypeDec
$cmax :: TypeDec -> TypeDec -> TypeDec
>= :: TypeDec -> TypeDec -> Bool
$c>= :: TypeDec -> TypeDec -> Bool
> :: TypeDec -> TypeDec -> Bool
$c> :: TypeDec -> TypeDec -> Bool
<= :: TypeDec -> TypeDec -> Bool
$c<= :: TypeDec -> TypeDec -> Bool
< :: TypeDec -> TypeDec -> Bool
$c< :: TypeDec -> TypeDec -> Bool
compare :: TypeDec -> TypeDec -> Ordering
$ccompare :: TypeDec -> TypeDec -> Ordering
$cp1Ord :: Eq TypeDec
Ord, TypeDec -> Q Exp
TypeDec -> Q (TExp TypeDec)
(TypeDec -> Q Exp) -> (TypeDec -> Q (TExp TypeDec)) -> Lift TypeDec
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: TypeDec -> Q (TExp TypeDec)
$cliftTyped :: TypeDec -> Q (TExp TypeDec)
lift :: TypeDec -> Q Exp
$clift :: TypeDec -> Q Exp
Lift)

{-|
Definition of a type.
-}
data TypeDef =
  {-|
  Sum.
  A list of pairs of names of its members
  (which will be mapped to constructors) and
  types which will populate the according constructors.
  -}
  SumTypeDef [(Text, [Type])] |
  {-|
  Product.
  Think of it as a record.
  Carries a list of associations of field names with types.
  -}
  ProductTypeDef [(Text, Type)] 
  deriving ((forall x. TypeDef -> Rep TypeDef x)
-> (forall x. Rep TypeDef x -> TypeDef) -> Generic TypeDef
forall x. Rep TypeDef x -> TypeDef
forall x. TypeDef -> Rep TypeDef x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TypeDef x -> TypeDef
$cfrom :: forall x. TypeDef -> Rep TypeDef x
Generic, Int -> TypeDef -> ShowS
[TypeDef] -> ShowS
TypeDef -> String
(Int -> TypeDef -> ShowS)
-> (TypeDef -> String) -> ([TypeDef] -> ShowS) -> Show TypeDef
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TypeDef] -> ShowS
$cshowList :: [TypeDef] -> ShowS
show :: TypeDef -> String
$cshow :: TypeDef -> String
showsPrec :: Int -> TypeDef -> ShowS
$cshowsPrec :: Int -> TypeDef -> ShowS
Show, TypeDef -> TypeDef -> Bool
(TypeDef -> TypeDef -> Bool)
-> (TypeDef -> TypeDef -> Bool) -> Eq TypeDef
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TypeDef -> TypeDef -> Bool
$c/= :: TypeDef -> TypeDef -> Bool
== :: TypeDef -> TypeDef -> Bool
$c== :: TypeDef -> TypeDef -> Bool
Eq, Eq TypeDef
Eq TypeDef
-> (TypeDef -> TypeDef -> Ordering)
-> (TypeDef -> TypeDef -> Bool)
-> (TypeDef -> TypeDef -> Bool)
-> (TypeDef -> TypeDef -> Bool)
-> (TypeDef -> TypeDef -> Bool)
-> (TypeDef -> TypeDef -> TypeDef)
-> (TypeDef -> TypeDef -> TypeDef)
-> Ord TypeDef
TypeDef -> TypeDef -> Bool
TypeDef -> TypeDef -> Ordering
TypeDef -> TypeDef -> TypeDef
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
min :: TypeDef -> TypeDef -> TypeDef
$cmin :: TypeDef -> TypeDef -> TypeDef
max :: TypeDef -> TypeDef -> TypeDef
$cmax :: TypeDef -> TypeDef -> TypeDef
>= :: TypeDef -> TypeDef -> Bool
$c>= :: TypeDef -> TypeDef -> Bool
> :: TypeDef -> TypeDef -> Bool
$c> :: TypeDef -> TypeDef -> Bool
<= :: TypeDef -> TypeDef -> Bool
$c<= :: TypeDef -> TypeDef -> Bool
< :: TypeDef -> TypeDef -> Bool
$c< :: TypeDef -> TypeDef -> Bool
compare :: TypeDef -> TypeDef -> Ordering
$ccompare :: TypeDef -> TypeDef -> Ordering
$cp1Ord :: Eq TypeDef
Ord, TypeDef -> Q Exp
TypeDef -> Q (TExp TypeDef)
(TypeDef -> Q Exp) -> (TypeDef -> Q (TExp TypeDef)) -> Lift TypeDef
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: TypeDef -> Q (TExp TypeDef)
$cliftTyped :: TypeDef -> Q (TExp TypeDef)
lift :: TypeDef -> Q Exp
$clift :: TypeDef -> Q Exp
Lift)

{-|
Type.
-}
data Type =
  {-|
  Fully applied tuple of the listed types.
  -}
  TupleType [Type] |
  {-|
  List of type applications.
  -}
  AppType (NonEmpty Type) |
  {-|
  List type with the type of its element.
  -}
  ListType Type |
  {-|
  Possibly qualified reference to another type.
  -}
  RefType Text
  deriving ((forall x. Type -> Rep Type x)
-> (forall x. Rep Type x -> Type) -> Generic Type
forall x. Rep Type x -> Type
forall x. Type -> Rep Type x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Type x -> Type
$cfrom :: forall x. Type -> Rep Type x
Generic, Int -> Type -> ShowS
[Type] -> ShowS
Type -> String
(Int -> Type -> ShowS)
-> (Type -> String) -> ([Type] -> ShowS) -> Show Type
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Type] -> ShowS
$cshowList :: [Type] -> ShowS
show :: Type -> String
$cshow :: Type -> String
showsPrec :: Int -> Type -> ShowS
$cshowsPrec :: Int -> Type -> ShowS
Show, Type -> Type -> Bool
(Type -> Type -> Bool) -> (Type -> Type -> Bool) -> Eq Type
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Type -> Type -> Bool
$c/= :: Type -> Type -> Bool
== :: Type -> Type -> Bool
$c== :: Type -> Type -> Bool
Eq, Eq Type
Eq Type
-> (Type -> Type -> Ordering)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Type)
-> (Type -> Type -> Type)
-> Ord Type
Type -> Type -> Bool
Type -> Type -> Ordering
Type -> Type -> Type
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
min :: Type -> Type -> Type
$cmin :: Type -> Type -> Type
max :: Type -> Type -> Type
$cmax :: Type -> Type -> Type
>= :: Type -> Type -> Bool
$c>= :: Type -> Type -> Bool
> :: Type -> Type -> Bool
$c> :: Type -> Type -> Bool
<= :: Type -> Type -> Bool
$c<= :: Type -> Type -> Bool
< :: Type -> Type -> Bool
$c< :: Type -> Type -> Bool
compare :: Type -> Type -> Ordering
$ccompare :: Type -> Type -> Ordering
$cp1Ord :: Eq Type
Ord, Type -> Q Exp
Type -> Q (TExp Type)
(Type -> Q Exp) -> (Type -> Q (TExp Type)) -> Lift Type
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Type -> Q (TExp Type)
$cliftTyped :: Type -> Q (TExp Type)
lift :: Type -> Q Exp
$clift :: Type -> Q Exp
Lift)