ddc-build-0.3.2.1: DDC/Build/Pipeline/Text.hs
{-# LANGUAGE GADTs #-}
module DDC.Build.Pipeline.Text
( PipeText (..)
, pipeText)
where
import DDC.Build.Pipeline.Error
import DDC.Build.Pipeline.Sink
import DDC.Build.Pipeline.Core
import DDC.Build.Language
import DDC.Base.Pretty
import qualified DDC.Base.Parser as BP
import qualified DDC.Core.Check as C
import qualified DDC.Core.Load as CL
import Control.DeepSeq
-- | Process program text.
data PipeText n (err :: * -> *) where
PipeTextOutput
:: !Sink
-> PipeText n err
PipeTextLoadCore
:: (Ord n, Show n, Pretty n)
=> !(Fragment n err)
-> ![PipeCore (C.AnTEC BP.SourcePos n) n]
-> PipeText n err
-- | Process a text module.
--
-- Returns empty list on success.
pipeText
:: NFData n
=> String
-> Int
-> String
-> PipeText n err
-> IO [Error]
pipeText !srcName !srcLine !str !pp
= case pp of
PipeTextOutput !sink
-> {-# SCC "PipeTextOutput" #-}
pipeSink str sink
PipeTextLoadCore !frag !pipes
-> {-# SCC "PipeTextLoadCore" #-}
let toks = fragmentLexModule frag srcName srcLine str
in case CL.loadModuleFromTokens (fragmentProfile frag) srcName toks of
Left err -> return $ [ErrorLoad err]
Right mm -> pipeCores mm pipes