(module ownership_total (data List (doc "Monomorphic singly-linked Int list — boxed, recursive.") (ctor Nil) (ctor Cons (con Int) (con List))) (fn list_length (doc "Borrow the list, count its elements.") (type (fn-type (params (borrow (con List))) (ret (own (con Int))))) (params xs) (body (match xs (case (pat-ctor Nil) 0) (case (pat-ctor Cons h t) (app + 1 (app list_length t)))))) (fn sum_list (doc "Consume the list, sum its elements.") (type (fn-type (params (own (con List))) (ret (own (con Int))))) (params xs) (body (match xs (case (pat-ctor Nil) 0) (case (pat-ctor Cons h t) (app + h (app sum_list t)))))) (fn main (doc "Build [1,2,3]; print length (3) then sum (6).") (type (fn-type (params) (ret (own (con Unit))) (effects IO))) (params) (body (let xs (term-ctor List Cons 1 (term-ctor List Cons 2 (term-ctor List Cons 3 (term-ctor List Nil)))) (seq (seq (app print (app list_length xs)) (do io/print_str "\n")) (seq (app print (app sum_list xs)) (do io/print_str "\n")))))))