!import "base.tri" !Local matchList = \a b : triage a _ b emptyList? = matchList true (\_ _ : false) head = matchList t (\head _ : head) tail = matchList t (\_ tail : tail) append = y (\self : matchList (\k : k) (\h r k : pair h (self r k))) lExist? = y (\self x : matchList false (\h z : or? (equal? x h) (self x z))) map_ = y (\self : matchList (\_ : t) (\head tail f : pair (f head) (self tail f))) map = \f l : map_ l f filter_ = y (\self : matchList (\_ : t) (\head tail f : matchBool (t head) id (f head) (self tail f))) filter = \f l : filter_ l f foldl_ = y (\self f l x : matchList (\acc : acc) (\head tail acc : self f tail (f acc head)) l x) foldl = \f x l : foldl_ f l x foldr_ = y (\self x f l : matchList x (\head tail : f (self x f tail) head) l) foldr = \f x l : foldr_ x f l length = y (\self : matchList 0 (\_ tail : succ (self tail))) reverse = y (\self : matchList t (\head tail : append (self tail) (pair head t))) snoc = y (\self x : matchList (pair x t) (\h z : pair h (self x z))) count = y (\self x : matchList 0 (\h z : matchBool (succ (self x z)) (self x z) (equal? x h))) last = y (\self : matchList t (\hd tl : matchBool hd (self tl) (emptyList? tl))) all? = y (\self pred : matchList true (\h z : and? (pred h) (self pred z))) any? = y (\self pred : matchList false (\h z : or? (pred h) (self pred z))) intersect = \xs ys : filter (\x : lExist? x ys) xs