-- |
-- 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. 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
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
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
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
Ord, forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => TypeDec -> m Exp
forall (m :: * -> *). Quote m => TypeDec -> Code m TypeDec
liftTyped :: forall (m :: * -> *). Quote m => TypeDec -> Code m TypeDec
$cliftTyped :: forall (m :: * -> *). Quote m => TypeDec -> Code m TypeDec
lift :: forall (m :: * -> *). Quote m => TypeDec -> m Exp
$clift :: forall (m :: * -> *). Quote m => TypeDec -> m 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. 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
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
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
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
Ord, forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => TypeDef -> m Exp
forall (m :: * -> *). Quote m => TypeDef -> Code m TypeDef
liftTyped :: forall (m :: * -> *). Quote m => TypeDef -> Code m TypeDef
$cliftTyped :: forall (m :: * -> *). Quote m => TypeDef -> Code m TypeDef
lift :: forall (m :: * -> *). Quote m => TypeDef -> m Exp
$clift :: forall (m :: * -> *). Quote m => TypeDef -> m 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. 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
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
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
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
Ord, forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => Type -> m Exp
forall (m :: * -> *). Quote m => Type -> Code m Type
liftTyped :: forall (m :: * -> *). Quote m => Type -> Code m Type
$cliftTyped :: forall (m :: * -> *). Quote m => Type -> Code m Type
lift :: forall (m :: * -> *). Quote m => Type -> m Exp
$clift :: forall (m :: * -> *). Quote m => Type -> m Exp
Lift)