-- GeNeRaTeD fOr: ../../CBS/Funcons/Computations/Control flow/Abnormal/Failing/else.aterm {-# LANGUAGE OverloadedStrings #-} module Funcons.Core.Computations.ControlFlow.Abnormal.Failing.Else where import Funcons.EDSL entities = [] types = typeEnvFromList [] funcons = libFromList [("else",NonStrictFuncon stepElse)] -- | -- /else(X1,X2,...,XN)/ evaluates each computation /X/ in turn, until one does -- *not*fail, returning the result of the successful computation. else_ fargs = FApp "else" (FTuple fargs) stepElse fargs = evalRules [rewrite1] [step1,step2,step3] where rewrite1 = do let env = emptyEnv env <- fsMatch fargs [PAnnotated (PMetaVar "V") (TName "values"),PSeqVar "Y+" PlusOp] env rewriteTermTo (TVar "V") env step1 = do let env = emptyEnv env <- lifted_fsMatch fargs [PMetaVar "X",PSeqVar "Y+" PlusOp] env env <- receiveSignalPatt "failed" (Nothing) (premise (TVar "X") (PMetaVar "X'") env) stepTermTo (TApp "else" (TTuple [TVar "X'",TVar "Y+"])) env step2 = do let env = emptyEnv env <- lifted_fsMatch fargs [PMetaVar "X",PMetaVar "Y"] env env <- receiveSignalPatt "failed" (Just (PADT "signal" [])) (premise (TVar "X") (PWildCard) env) stepTermTo (TVar "Y") env step3 = do let env = emptyEnv env <- lifted_fsMatch fargs [PMetaVar "X",PMetaVar "Y",PSeqVar "Z+" PlusOp] env env <- receiveSignalPatt "failed" (Just (PADT "signal" [])) (premise (TVar "X") (PWildCard) env) stepTermTo (TApp "else" (TTuple [TVar "Y",TVar "Z+"])) env