descript-lang-0.2.0.0: src/Descript/Build/Read/Read.hs
module Descript.Build.Read.Read
( Dep
, DepResult
, DepResultT
, DirtyDep
, DirtyDepT
, Depd
, DirtyDepd
, DepResolver
, DFile
, readSrc
, readInputValIn
, readOutputValIn
) where
import Descript.Build.Read.Parse
import qualified Descript.BasicInj.Data.Value.In as BasicInj.In
import qualified Descript.BasicInj.Data.Value.Out as BasicInj.Out
import qualified Descript.BasicInj as BasicInj
import qualified Descript.Sugar as Sugar
import Descript.Misc
import Core.Control.Monad.Trans
import Control.Monad.Trans.Class
-- Note: If there are multiple dependency requiring values, replace with
-- custom @Gen...@ instances which contain all those values as
-- dependencies. Create a wrapper for 'BasicInj.validate' which takes
-- all the dependencies dirty, passes the 'BasicInj' dependencies to
-- 'BasicInj.validate', and returns the (ok) result with all of the
-- dependencies but removes the dirty wrapper (probably reimplement
-- 'BasicInj.validate's control structure and call 'BasicInj.validate''
-- directly).
type Dep = BasicInj.Dep
type DepResult = BasicInj.DepResult
type DepResultT u = BasicInj.DepResultT u
type DirtyDep an = BasicInj.DirtyDep an
type DirtyDepT an u = BasicInj.DirtyDepT an u
type Depd a an = BasicInj.Depd a an
type DirtyDepd a an = BasicInj.DirtyDepd a an
type DepResolver u = BasicInj.DepResolver u
type DFile u = BasicInj.DFile u
-- | Parses source, resolves its dependencies, and refines it.
readSrc :: (Monad u)
=> DFile u
-> ParseResultT u (DirtyDepd BasicInj.Source SrcAnn)
readSrc (DFile rsvr sfile')
= refineR =<< resolveR rsvr =<< parseR sfile'
where refineR = pure . Sugar.refineDDepd
resolveR rsvr' = lift . Sugar.resolve rsvr'
parseR = hoist . parse
readInputValIn :: AbsScope
-> BasicInj.RecordCtx ()
-> SFile
-> ParseResult (BasicInj.In.Value SrcAnn)
readInputValIn scope ctx
= fmap (Sugar.refineInputValIn scope ctx) . parseInputVal
readOutputValIn :: AbsScope
-> BasicInj.RecordCtx ()
-> BasicInj.In.Value ()
-> SFile
-> ParseResult (BasicInj.Out.Value SrcAnn)
readOutputValIn scope ctx in'
= fmap (Sugar.refineOutputValIn scope ctx in') . parseOutputVal