packages feed

mulang-4.4.0: src/Language/Mulang/Analyzer/FragmentParser.hs

module        Language.Mulang.Analyzer.FragmentParser (
  parseFragment,
  parseFragment') where

import        Control.Fallible (orFail)

import        Language.Mulang
import        Language.Mulang.Parsers (EitherParser, maybeToEither)
import        Language.Mulang.Parsers.Haskell
import        Language.Mulang.Parsers.JavaScript (parseJavaScript)
import        Language.Mulang.Parsers.Prolog (parseProlog)
import        Language.Mulang.Parsers.Java (parseJava)
import        Language.Mulang.Parsers.Python (parsePython)
import        Language.Mulang.Analyzer.Analysis (Fragment(..), Language(..))
import        Language.Mulang.Builder (normalize, normalizeWith, NormalizationOptions)

parseFragment' :: Fragment -> Expression
parseFragment' = orFail . parseFragment

parseFragment :: Fragment -> Either String Expression
parseFragment (CodeSample language content) = (parserFor language) content
parseFragment (MulangSample ast options)    = Right . (normalizerFor options) $ ast

parserFor :: Language -> EitherParser
parserFor Haskell        = parseHaskell
parserFor Java           = parseJava
parserFor JavaScript     = maybeToEither parseJavaScript
parserFor Prolog         = parseProlog
parserFor Python         = parsePython

normalizerFor :: (Maybe NormalizationOptions) -> (Expression -> Expression)
normalizerFor Nothing        = normalize
normalizerFor (Just options) = normalizeWith options