packages feed

funcons-tools-0.1.0.0: cbs/Funcons/Core/Computations/DataFlow/Binding/Recursion/BindRecursively.hs

-- GeNeRaTeD fOr: ../../CBS/Funcons/Computations/Data flow/Binding/Recursion/bind-recursively.aterm
{-# LANGUAGE OverloadedStrings #-}

module Funcons.Core.Computations.DataFlow.Binding.Recursion.BindRecursively where

import Funcons.EDSL

entities = []

types = typeEnvFromList
    []

funcons = libFromList
    [("bind-recursively",PartiallyStrictFuncon [Strict,NonStrict] stepBind_recursively)]

-- |
-- /bind-recursively(B,E)/ binds /B/ to the result of evaluating /E/ , which may
--   recursively refer to /B/ (using /bound-recursively/ ).   
bind_recursively_ fargs = FApp "bind-recursively" (FTuple fargs)
stepBind_recursively fargs@[arg1,arg2] =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- fsMatch fargs [PAnnotated (PMetaVar "B") (TName "values"),PMetaVar "E"] env
            rewriteTermTo (TApp "recursive" (TTuple [TSet [TVar "B"],TApp "bind" (TTuple [TVar "B",TVar "E"])])) env
stepBind_recursively fargs = sortErr (FApp "bind-recursively" (FTuple fargs)) "invalid number of arguments"