-- GeNeRaTeD fOr: ../../CBS/Funcons/Computations/Control flow/Normal/Iterating/Definite/Reducing collections/list-foldr.aterm {-# LANGUAGE OverloadedStrings #-} module Funcons.Core.Computations.ControlFlow.Normal.Iterating.Definite.ReducingCollections.ListFoldr where import Funcons.EDSL entities = [] types = typeEnvFromList [] funcons = libFromList [("list-foldr",PartiallyStrictFuncon [NonStrict,Strict,Strict] stepList_foldr)] -- | -- /list-foldr(F,A,L)/ reduces a list /L/ to a single value by folding it from -- the right, using /A/ as the initial accumulator value, and iteratively -- updating the accumulator by executing the computation /F/ with the -- the last element of the remaining list and the accumulator value as its pair -- of arguments. list_foldr_ fargs = FApp "list-foldr" (FTuple fargs) stepList_foldr fargs@[arg1,arg2,arg3] = evalRules [rewrite1,rewrite2] [] where rewrite1 = do let env = emptyEnv env <- fsMatch fargs [PWildCard,PValue (PList []),PMetaVar "A"] env rewriteTermTo (TVar "A") env rewrite2 = do let env = emptyEnv env <- fsMatch fargs [PMetaVar "F",PValue (PList [VPMetaVar "V",VPSeqVar "V*" StarOp]),PMetaVar "A"] env rewriteTermTo (TApp "give" (TTuple [TTuple [TVar "V",TApp "list-foldr" (TTuple [TVar "F",TList [TVar "V*"],TVar "A"])],TVar "F"])) env stepList_foldr fargs = sortErr (FApp "list-foldr" (FTuple fargs)) "invalid number of arguments"