-- GeNeRaTeD fOr: ../../CBS/Funcons/Computations/Control flow/Normal/Iterating/Definite/Filtering collections/list-filter.aterm {-# LANGUAGE OverloadedStrings #-} module Funcons.Core.Computations.ControlFlow.Normal.Iterating.Definite.FilteringCollections.ListFilter where import Funcons.EDSL entities = [] types = typeEnvFromList [] funcons = libFromList [("list-filter",PartiallyStrictFuncon [NonStrict,Strict] stepList_filter)] -- | -- /list-filter(P,L)/ discards all elements from the list /L/ that do not -- satisify the predicate /P/ . list_filter_ fargs = FApp "list-filter" (FTuple fargs) stepList_filter fargs@[arg1,arg2] = evalRules [rewrite1,rewrite2] [] where rewrite1 = do let env = emptyEnv env <- fsMatch fargs [PMetaVar "P",PValue (PList [])] env rewriteTo (FList []) rewrite2 = do let env = emptyEnv env <- fsMatch fargs [PMetaVar "P",PValue (PList [VPMetaVar "V",VPSeqVar "V*" StarOp])] env rewriteTermTo (TApp "if-then-else" (TTuple [TApp "give" (TTuple [TVar "V",TVar "P"]),TApp "cons" (TTuple [TVar "V",TApp "list-filter" (TTuple [TVar "P",TList [TVar "V*"]])]),TApp "list-filter" (TTuple [TVar "P",TList [TVar "V*"]])])) env stepList_filter fargs = sortErr (FApp "list-filter" (FTuple fargs)) "invalid number of arguments"