module SyntaxTrees.Haskell.Type where

import SyntaxTrees.Haskell.Common (Module, QClass)


newtype TypeParam
  = TypeParam String
  deriving (TypeParam -> TypeParam -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TypeParam -> TypeParam -> Bool
$c/= :: TypeParam -> TypeParam -> Bool
== :: TypeParam -> TypeParam -> Bool
$c== :: TypeParam -> TypeParam -> Bool
Eq, Eq TypeParam
TypeParam -> TypeParam -> Bool
TypeParam -> TypeParam -> Ordering
TypeParam -> TypeParam -> TypeParam
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 :: TypeParam -> TypeParam -> TypeParam
$cmin :: TypeParam -> TypeParam -> TypeParam
max :: TypeParam -> TypeParam -> TypeParam
$cmax :: TypeParam -> TypeParam -> TypeParam
>= :: TypeParam -> TypeParam -> Bool
$c>= :: TypeParam -> TypeParam -> Bool
> :: TypeParam -> TypeParam -> Bool
$c> :: TypeParam -> TypeParam -> Bool
<= :: TypeParam -> TypeParam -> Bool
$c<= :: TypeParam -> TypeParam -> Bool
< :: TypeParam -> TypeParam -> Bool
$c< :: TypeParam -> TypeParam -> Bool
compare :: TypeParam -> TypeParam -> Ordering
$ccompare :: TypeParam -> TypeParam -> Ordering
Ord, Int -> TypeParam -> String -> String
[TypeParam] -> String -> String
TypeParam -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [TypeParam] -> String -> String
$cshowList :: [TypeParam] -> String -> String
show :: TypeParam -> String
$cshow :: TypeParam -> String
showsPrec :: Int -> TypeParam -> String -> String
$cshowsPrec :: Int -> TypeParam -> String -> String
Show)

data TypeVar
  = TypeVar String
  | UnitType
  deriving (Int -> TypeVar -> String -> String
[TypeVar] -> String -> String
TypeVar -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [TypeVar] -> String -> String
$cshowList :: [TypeVar] -> String -> String
show :: TypeVar -> String
$cshow :: TypeVar -> String
showsPrec :: Int -> TypeVar -> String -> String
$cshowsPrec :: Int -> TypeVar -> String -> String
Show)

data TypeCtor
  = TypeCtor String
  | Arrow
  | TupleType
  | ListType
  deriving (Int -> TypeCtor -> String -> String
[TypeCtor] -> String -> String
TypeCtor -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [TypeCtor] -> String -> String
$cshowList :: [TypeCtor] -> String -> String
show :: TypeCtor -> String
$cshow :: TypeCtor -> String
showsPrec :: Int -> TypeCtor -> String -> String
$cshowsPrec :: Int -> TypeCtor -> String -> String
Show)

data AnyKindedType
  = TypeValue Type
  | TypeFn QTypeCtor
  deriving (Int -> AnyKindedType -> String -> String
[AnyKindedType] -> String -> String
AnyKindedType -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [AnyKindedType] -> String -> String
$cshowList :: [AnyKindedType] -> String -> String
show :: AnyKindedType -> String
$cshow :: AnyKindedType -> String
showsPrec :: Int -> AnyKindedType -> String -> String
$cshowsPrec :: Int -> AnyKindedType -> String -> String
Show)

data ClassConstraint
  = ClassConstraint QClass [Type]
  deriving (Int -> ClassConstraint -> String -> String
[ClassConstraint] -> String -> String
ClassConstraint -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [ClassConstraint] -> String -> String
$cshowList :: [ClassConstraint] -> String -> String
show :: ClassConstraint -> String
$cshow :: ClassConstraint -> String
showsPrec :: Int -> ClassConstraint -> String -> String
$cshowsPrec :: Int -> ClassConstraint -> String -> String
Show)

data Type
  = CtorTypeApply QTypeCtor [Type]
  | ParamTypeApply TypeParam [Type]
  | NestedTypeApply Type [Type]
  | TypeVar' QTypeVar
  | TypeParam' TypeParam
  | TypeScope [TypeParam] Type
  | ClassScope [ClassConstraint] Type
  deriving (Int -> Type -> String -> String
[Type] -> String -> String
Type -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Type] -> String -> String
$cshowList :: [Type] -> String -> String
show :: Type -> String
$cshow :: Type -> String
showsPrec :: Int -> Type -> String -> String
$cshowsPrec :: Int -> Type -> String -> String
Show)


data QTypeVar
  = QTypeVar (Maybe Module) TypeVar
  deriving (Int -> QTypeVar -> String -> String
[QTypeVar] -> String -> String
QTypeVar -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [QTypeVar] -> String -> String
$cshowList :: [QTypeVar] -> String -> String
show :: QTypeVar -> String
$cshow :: QTypeVar -> String
showsPrec :: Int -> QTypeVar -> String -> String
$cshowsPrec :: Int -> QTypeVar -> String -> String
Show)

data QTypeCtor
  = QTypeCtor (Maybe Module) TypeCtor
  deriving (Int -> QTypeCtor -> String -> String
[QTypeCtor] -> String -> String
QTypeCtor -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [QTypeCtor] -> String -> String
$cshowList :: [QTypeCtor] -> String -> String
show :: QTypeCtor -> String
$cshow :: QTypeCtor -> String
showsPrec :: Int -> QTypeCtor -> String -> String
$cshowsPrec :: Int -> QTypeCtor -> String -> String
Show)