; Iter 15h — demo for the new std_list combinators `take` and `drop`.
; Uses a top-level `(const xs)` for the canonical [1, 2, 3, 4, 5] —
; pure ctor expression, so a const is fine (same idiom as
; std_list_demo). Six checks pin both n=0, 0<n<length, and n>length
; boundaries on each combinator.

(module std_list_more_demo

  (import std_list)

  (const xs
    (doc "The canonical [1, 2, 3, 4, 5] used across all checks.")
    (type (con std_list.List (con Int)))
    (body
      (term-ctor std_list.List Cons 1
        (term-ctor std_list.List Cons 2
          (term-ctor std_list.List Cons 3
            (term-ctor std_list.List Cons 4
              (term-ctor std_list.List Cons 5
                (term-ctor std_list.List Nil))))))))

  (fn main
    (doc "Expected output (one per line): 0, 3, 5, 5, 3, 0.")
    (type (fn-type (params) (ret (con Unit)) (effects IO)))
    (params)
    (body
      (seq (do io/print_int (app std_list.length (app std_list.take 0   xs)))
      (seq (do io/print_int (app std_list.length (app std_list.take 3   xs)))
      (seq (do io/print_int (app std_list.length (app std_list.take 100 xs)))
      (seq (do io/print_int (app std_list.length (app std_list.drop 0   xs)))
      (seq (do io/print_int (app std_list.length (app std_list.drop 2   xs)))
           (do io/print_int (app std_list.length (app std_list.drop 100 xs)))))))))))
