Source file nonEmptyList.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type 'a t =
  | Cons of 'a * 'a list
[@@deriving eq, ord]

module Functor_seed = struct
  type nonrec 'a t = 'a t
  let map ~f (Cons (x, xs)) = Cons (f x, List.map f xs)
end
include (Functor.Make (Functor_seed) : Functor.S with type 'a t := 'a t)

let cons x (Cons (x', xs)) = Cons (x, x' :: xs)
let uncons (Cons (x, xs)) = (x, xs)

let hd (Cons (x, _))  = x
let tl (Cons (_, xs)) = xs
let append (Cons (x, xs)) (Cons (y, ys)) =
  Cons (x, List.append xs (y::ys))

let op = append

let fold op xs =
  let (x, xs) = uncons xs in
  List.fold_left op x xs

let of_list = function
  | x :: xs -> Some (Cons (x, xs))
  | []      -> None

let to_list (Cons (x, xs)) = x :: xs