module Language.MSH.CodeGen.Interop (
parseType,
parseDecs,
parseExp
) where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import qualified Language.Haskell.Exts.Syntax as Syntax
import qualified Language.Haskell.Exts.Parser as Exts
import Language.Haskell.Exts.Extension
import Language.Haskell.Meta.Syntax.Translate (toType, toDecs, toExp)
extensions = map EnableExtension [GADTs,
TypeFamilies,
RankNTypes,
FunctionalDependencies,
ScopedTypeVariables,
MultiParamTypeClasses,
FlexibleInstances,
FlexibleContexts,
TypeOperators,
LambdaCase]
parseMode = Exts.ParseMode "" Haskell2010 extensions True True Nothing
parseType :: String -> Type
parseType = toType . Exts.fromParseResult . Exts.parseTypeWithMode parseMode
parseDecs :: String -> [Dec]
parseDecs xs = let (Syntax.Module _ _ _ _ _ _ ds) = Exts.fromParseResult $ Exts.parseModuleWithMode parseMode xs in toDecs ds
parseExp :: String -> Exp
parseExp = toExp . Exts.fromParseResult . Exts.parseExpWithMode parseMode