; Iter 15d — third consumer demo.
; Imports std_either, exercises all five combinators. First demo to
; pass two function arguments to a single combinator (the eliminator
; `either`); first to drive a 3-type-var polymorphic fn end-to-end.

(module std_either_demo

  (import std_either)

  (fn inc
    (doc "Add 1 to an Int. Used as the function arg to map_right and either.")
    (type (fn-type (params (con Int)) (ret (con Int))))
    (params x)
    (body (app + x 1)))

  (fn main
    (doc "Drive each std_either combinator. Expected outputs (per line): 42, 99, true, true, 42, 6, 101.")
    (type (fn-type (params) (ret (con Unit)) (effects IO)))
    (params)
    (body
      (seq (do io/print_int  (app std_either.from_right 0  (term-ctor std_either.Either Right 42)))
      (seq (do io/print_int  (app std_either.from_right 99 (term-ctor std_either.Either Left  7)))
      (seq (do io/print_bool (app std_either.is_left        (term-ctor std_either.Either Left  7)))
      (seq (do io/print_bool (app std_either.is_right       (term-ctor std_either.Either Right 42)))
      (seq (do io/print_int  (app std_either.from_right 0
                                (app std_either.map_right inc
                                  (term-ctor std_either.Either Right 41))))
      (seq (do io/print_int  (app std_either.either inc inc
                                (term-ctor std_either.Either Left 5)))
           (do io/print_int  (app std_either.either inc inc
                                (term-ctor std_either.Either Right 100))))))))))))
