module Language.Haskell.Tools.AST.Types where
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Kinds
import Language.Haskell.Tools.AST.TH
data TyVar dom stage
= TyVarDecl { _tyVarName :: Ann Name dom stage
, _tyVarKind :: AnnMaybe KindConstraint dom stage
}
data Type dom stage
= TyForall { _typeBounded :: AnnList TyVar dom stage
, _typeType :: Ann Type dom stage
}
| TyCtx { _typeCtx :: Ann Context dom stage
, _typeType :: Ann Type dom stage
}
| TyFun { _typeParam :: Ann Type dom stage
, _typeResult :: Ann Type dom stage
}
| TyTuple { _typeElements :: AnnList Type dom stage
}
| TyUnbTuple { _typeElements :: AnnList Type dom stage
}
| TyList { _typeElement :: Ann Type dom stage
}
| TyParArray { _typeElement :: Ann Type dom stage
}
| TyApp { _typeCon :: Ann Type dom stage
, _typeArg :: Ann Type dom stage
}
| TyVar { _typeName :: Ann Name dom stage
}
| TyParen { _typeInner :: Ann Type dom stage
}
| TyInfix { _typeLeft :: Ann Type dom stage
, _typeOperator :: Ann Operator dom stage
, _typeRight :: Ann Type dom stage
}
| TyKinded { _typeInner :: Ann Type dom stage
, _typeKind :: Ann Kind dom stage
}
| TyPromoted { _tpPromoted :: Ann (Promoted Type) dom stage
}
| TySplice { _tsSplice :: Splice dom stage
}
| TyQuasiQuote { _typeQQ :: QuasiQuote dom stage
}
| TyBang { _typeInner :: Ann Type dom stage
}
| TyLazy { _typeInner :: Ann Type dom stage
}
| TyUnpack { _typeInner :: Ann Type dom stage
}
| TyNoUnpack { _typeInner :: Ann Type dom stage
}
| TyWildcard
| TyNamedWildc { _typeWildcardName :: Ann Name dom stage
}
data Context dom stage
= ContextOne { _contextAssertion :: Ann Assertion dom stage
}
| ContextMulti { _contextAssertions :: AnnList Assertion dom stage
}
data Assertion dom stage
= ClassAssert { _assertClsName :: Ann Name dom stage
, _assertTypes :: AnnList Type dom stage
}
| InfixAssert { _assertLhs :: Ann Type dom stage
, _assertOp :: Ann Operator dom stage
, _assertRhs :: Ann Type dom stage
}
| ImplicitAssert { _assertImplVar :: Ann Name dom stage
, _assertImplType :: Ann Type dom stage
}