(module c1_local_hof (data Box (doc "heap cell") (ctor Box (con Int))) (data List (doc "boxed list of boxes") (ctor Nil) (ctor Cons (con Box) (con List))) (fn filter_box (doc "borrow-mode predicate p applied to h; h reused in the kept Cons") (type (fn-type (params (borrow (fn-type (params (borrow (con Box))) (ret (own (con Bool))))) (own (con List))) (ret (own (con List))))) (params p xs) (body (match xs (case (pat-ctor Nil) (term-ctor List Nil)) (case (pat-ctor Cons h t) (if (app p h) (term-ctor List Cons h (app filter_box p t)) (app filter_box p t)))))))