Connect SetListElem to outer output list
This commit is contained in:
parent
8c7e311338
commit
4884136dad
|
@ -13,7 +13,7 @@ data TypedRun a b where
|
||||||
FunctionIO :: IsFunctionIO f a b => f -> TypedRun a b
|
FunctionIO :: IsFunctionIO f a b => f -> TypedRun a b
|
||||||
Inject :: b -> TypedRun () b
|
Inject :: b -> TypedRun () b
|
||||||
GetListElem :: TypedRun [b] b
|
GetListElem :: TypedRun [b] b
|
||||||
SetListElem :: TypedRun a ()
|
SetListElem :: TypedRun a [a]
|
||||||
MapComp :: [DependencyUntyped] -> TypedRun [a] [b]
|
MapComp :: [DependencyUntyped] -> TypedRun [a] [b]
|
||||||
|
|
||||||
deriving instance (Show a, Show b) => Show (TypedRun a b)
|
deriving instance (Show a, Show b) => Show (TypedRun a b)
|
||||||
|
@ -44,24 +44,30 @@ evalComputationM' top m = runState (execWriterT (unComputationM m)) top
|
||||||
evalComputationM :: ComputationM () -> [DependencyUntyped]
|
evalComputationM :: ComputationM () -> [DependencyUntyped]
|
||||||
evalComputationM m = fst (evalComputationM' 0 m)
|
evalComputationM m = fst (evalComputationM' 0 m)
|
||||||
|
|
||||||
genDependency :: (Show u, Show a) => (Token a -> Dependency u a) -> ComputationM a
|
genDependency' :: (Show u, Show a) => (Token a -> ComputationM' (Dependency u a)) -> ComputationM a
|
||||||
genDependency g = do
|
genDependency' f = do
|
||||||
top <- get
|
top <- get
|
||||||
let top' = top + 1
|
let top' = top + 1
|
||||||
target = Token top'
|
target = Token top'
|
||||||
put top'
|
put top'
|
||||||
let result = g target
|
result <- f target
|
||||||
tell [DependencyUntyped result (show result)]
|
tell [DependencyUntyped result (show result)]
|
||||||
pure target
|
pure target
|
||||||
|
|
||||||
|
genDependency :: (Show u, Show a) => (Token a -> Dependency u a) -> ComputationM a
|
||||||
|
genDependency g = genDependency' (\t -> pure $ g t)
|
||||||
|
|
||||||
inject :: Show a => a -> ComputationM a
|
inject :: Show a => a -> ComputationM a
|
||||||
inject x = genDependency (Dependency NoToken (Inject x))
|
inject x = genDependency (Dependency NoToken (Inject x))
|
||||||
|
|
||||||
getListElem :: Show a => Token [a] -> ComputationM a
|
getListElem :: Show a => Token [a] -> ComputationM a
|
||||||
getListElem outer = genDependency (Dependency outer GetListElem)
|
getListElem outer = genDependency (Dependency outer GetListElem)
|
||||||
|
|
||||||
setListElem :: Show a => Token a -> ComputationM ()
|
setListElem :: Show a => Token a -> Token [a] -> ComputationM ()
|
||||||
setListElem a = genDependency (Dependency a SetListElem)
|
setListElem a outer = do
|
||||||
|
tell [DependencyUntyped d (show d)]
|
||||||
|
pure NoToken
|
||||||
|
where d = Dependency a SetListElem outer
|
||||||
|
|
||||||
run :: (Show a, Show b, IsFunction f a b) => f -> Token a -> ComputationM b
|
run :: (Show a, Show b, IsFunction f a b) => f -> Token a -> ComputationM b
|
||||||
run f input = genDependency (Dependency input (Function f))
|
run f input = genDependency (Dependency input (Function f))
|
||||||
|
@ -79,13 +85,11 @@ saveFile = runIO SaveFile
|
||||||
runPandoc = runIO RunPandoc
|
runPandoc = runIO RunPandoc
|
||||||
|
|
||||||
mapComputationM :: (Show a, Show b) => (Token a -> ComputationM b) -> Token [a] -> ComputationM [b]
|
mapComputationM :: (Show a, Show b) => (Token a -> ComputationM b) -> Token [a] -> ComputationM [b]
|
||||||
mapComputationM f input = do
|
mapComputationM f input = genDependency' $ \target -> do
|
||||||
top <- get
|
top <- get
|
||||||
let (res, top') = evalComputationM' top m
|
let (res, top') = evalComputationM' top $ do
|
||||||
put top'
|
|
||||||
genDependency (Dependency input (MapComp res))
|
|
||||||
where m :: ComputationM ()
|
|
||||||
m = do
|
|
||||||
inp <- getListElem input
|
inp <- getListElem input
|
||||||
outp <- f inp
|
outp <- f inp
|
||||||
setListElem outp
|
setListElem outp target
|
||||||
|
put top'
|
||||||
|
pure (Dependency input (MapComp res) target)
|
||||||
|
|
Loading…
Reference in New Issue