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 a
= TyVarDecl { _tyVarName :: Ann Name a
, _tyVarKind :: AnnMaybe KindConstraint a
}
data Type a
= TyForall { _typeBounded :: AnnList TyVar a
, _typeType :: Ann Type a
}
| TyCtx { _typeCtx :: Ann Context a
, _typeType :: Ann Type a
}
| TyFun { _typeParam :: Ann Type a
, _typeResult :: Ann Type a
}
| TyTuple { _typeElements :: AnnList Type a
}
| TyUnbTuple { _typeElements :: AnnList Type a
}
| TyList { _typeElement :: Ann Type a
}
| TyParArray { _typeElement :: Ann Type a
}
| TyApp { _typeCon :: Ann Type a
, _typeArg :: Ann Type a
}
| TyVar { _typeName :: Ann Name a
}
| TyParen { _typeInner :: Ann Type a
}
| TyInfix { _typeLeft :: Ann Type a
, _typeOperator :: Ann Operator a
, _typeRight :: Ann Type a
}
| TyKinded { _typeInner :: Ann Type a
, _typeKind :: Ann Kind a
}
| TyPromoted { _tpPromoted :: Ann (Promoted Type) a
}
| TySplice { _tsSplice :: Splice a
}
| TyQuasiQuote { _typeQQ :: QuasiQuote a
}
| TyBang { _typeInner :: Ann Type a
}
| TyLazy { _typeInner :: Ann Type a
}
| TyUnpack { _typeInner :: Ann Type a
}
| TyNoUnpack { _typeInner :: Ann Type a
}
| TyWildcard
| TyNamedWildc { _typeWildcardName :: Ann Name a
}
data Context a
= ContextOne { _contextAssertion :: Ann Assertion a
}
| ContextMulti { _contextAssertions :: AnnList Assertion a
}
data Assertion a
= ClassAssert { _assertClsName :: Ann Name a
, _assertTypes :: AnnList Type a
}
| InfixAssert { _assertLhs :: Ann Type a
, _assertOp :: Ann Operator a
, _assertRhs :: Ann Type a
}