--- /dev/null
+(* Non-empty lists *)
+type 'a listx =
+ | Nil of 'a
+ | Cons of ('a * 'a listx)
+
+let rec fold_left f acc l =
+ match l with
+ | Nil x -> f acc x
+ | Cons (x, l') -> fold_left f (f acc x) l'
+
+let hd =
+ function
+ | Nil x
+ | Cons (x,_) -> x
+
+let rec map f =
+ function
+ | Nil x -> Nil (f x)
+ | Cons (x, l') -> Cons (f x, map f l')
+
+let rec append l =
+ function
+ | Nil x -> Cons (x, l)
+ | Cons (x, l') -> Cons (x, append l l')
+
+let rec length = function
+ | Nil _ -> 1
+ | Cons (_, xs) -> 1 + (length xs)
+
+let rec assoc x = function
+ | Nil (y,t)
+ | Cons ((y,t),_) when x=y -> t
+ | Nil _ -> raise Not_found
+ | Cons (_,l) -> assoc x l
+
+let rec to_list =
+ function
+ Nil x -> [x]
+ | Cons (x,l) -> x::to_list l
+
+let rec from_list =
+ function
+ [] -> raise (Failure "from_list: empty list")
+ | [x] -> Nil x
+ | x::l -> Cons(x,from_list l)
+
+let rec split_nth n l =
+ match n,l with
+ 0,_ -> []
+ | 1,Nil x -> [x]
+ | n,Cons (hd,tl) -> hd::split_nth (n-1) tl
+ | _,_ -> raise (Failure "split_nth: not enough args")
+
+let rec max =
+ function
+ | Nil x -> x
+ | Cons (x, l) -> Pervasives.max x (max l)
+
+(*
+let rec nth i l = match l, i with
+ | Cons (x, _), 1 -> x
+ | _, n when n <= 0 -> raise (Invalid_argument "Listx.nth")
+ | Cons (_, xs), n -> nth (n-1) xs
+ | Nil x, 1 -> x
+ | Nil _, _ -> raise (Invalid_argument "Listx.nth")
+;;
+*)
+