+module test
+
+import StdMisc
+import iTasks
+import Data.Either
+import StdEnv
+import Data.Func
+
+Start w = flip doTasks w $
+ updateInformation () [] 42
+ >>* [OnAction (Action "Continue") (always (return 43))]
+
+(>>*) infixl 1// :: !(Task a) ![TaskCont a (Task b)] -> Task b | iTask a & iTask b
+(>>*) task steps :== step task (const Nothing) steps
+
+step :: !(Task a) ((Maybe a) -> Maybe b) [TaskCont a (Task b)] -> Task b | iTask a & iTask b
+step lhs lhsValFun conts
+ = parallel
+ [(Embedded, \stl->lhs @? \v->case v of
+ NoValue = Value (Left Nothing) False
+ (Value v s) = Value (Left (Just v)) s
+ )]
+ (map stepCont conts)
+ @? stepVal lhsValFun
+where
+ stepVal :: ((Maybe a) -> Maybe b) (TaskValue [(Int, TaskValue (Either (Maybe a) b))]) -> TaskValue b
+ stepVal tfun NoValue = NoValue
+ stepVal tfun (Value [(_, x):_] _) = case x of
+ //Not yet stepped:
+ Value (Left l) s = case tfun l of
+ Nothing = NoValue
+ Just v = Value v False
+ //Stepped but no value
+ NoValue = NoValue
+ Value (Right r) s = Value r s
+ stepVal _ _ = abort "cannot happen"
+
+ stepCont :: (TaskCont a (Task b)) -> TaskCont
+ [(Int, TaskValue (Either (Maybe a) b))]
+ (ParallelTaskType, ParallelTask (Either (Maybe a) b))
+ stepCont (OnValue f) = OnValue (transform f)
+ stepCont (OnAction a f) = OnAction a (transform f)
+
+ transform f v
+ # v = case v of
+ Value [(_, v)] _ = case v of
+ NoValue = NoValue
+ Value (Left (Just v)) s = Value v s
+ Value _ = NoValue
+ NoValue = NoValue
+ = case f v of
+ Nothing = Nothing
+ Just t = Just (Embedded, \stl->
+ get (sdsFocus {onlyIndex=Nothing,onlyTaskId=Nothing,onlySelf=False,includeValue=False,includeProgress=False,includeAttributes=False} stl)
+ removeTask taskId stl
+ >-| t @ Right)
+
+// stepCont (OnException f) = OnException \e->(Embedded, \stl->e f @ Right)
+// stepCont (OnAllExceptions b) = OnAllExceptions b