module Database.Algebra.Dag.Build
( Build
, runBuild
, tagM
, insert
, insertNoShare
) where
import Control.Monad.State
import qualified Data.IntMap as IM
import qualified Database.Algebra.Dag as Dag
import Database.Algebra.Dag.Common
data BuildState alg = BuildState
{ dag :: Dag.AlgebraDag alg
, tags :: NodeMap [Tag]
}
type Build alg = State (BuildState alg)
runBuild :: Build alg r -> (Dag.AlgebraDag alg, r, NodeMap [Tag])
runBuild m = (dag s, r, tags s)
where
initialBuildState = BuildState { dag = Dag.emptyDag, tags = IM.empty }
(r, s) = runState m initialBuildState
tag :: String -> AlgNode -> Build alg AlgNode
tag msg c = do
modify $ \s -> s { tags = IM.insertWith (++) c [msg] $ tags s }
return c
tagM :: String -> Build alg AlgNode -> Build alg AlgNode
tagM s = (=<<) (tag s)
insert :: Dag.Operator alg => alg -> Build alg AlgNode
insert op = do
d <- gets dag
let (n, d') = Dag.insert op d
modify $ \s -> s { dag = d' }
return n
insertNoShare :: Dag.Operator alg => alg -> Build alg AlgNode
insertNoShare op = do
d <- gets dag
let (n, d') = Dag.insertNoShare op d
modify $ \s -> s { dag = d' }
return n