Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tag: v1311
Fetching contributors…

Cannot retrieve contributors at this time

57 lines (45 sloc) 1.731 kb
Copyright © 2011 MLstate
This file is part of OPA.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
(* cf mli *)
(* guidlines: define step by step whenever you need, in the same order than in Base.List *)
module List = Base.List
type 'a t = 'a * 'a list
external unwrap : 'a t -> 'a list = "%identity"
let wrap = function
| t::q -> t, q
| _ -> invalid_arg "HdList.wrap"
let singleton a = a, []
let length (_, l) = succ (List.length l)
let hd = fst
let tl = snd
let last (a, l) =
match l with
| [] -> a
| tl -> hd (wrap (List.rev tl))
let nth (hd, tl) i = if i = 0 then hd else List.nth tl (pred i)
let rev (hd, tl) = wrap (List.rev (hd::tl))
let iter f (hd, tl) = f hd; List.iter f tl
let map f (hd, tl) = f hd, f tl
let fold_left f acc (hd, tl) = List.fold_left f (f acc hd) tl
let fold_right f acc (hd, tl) =
let tl = List.rev tl in
let acc = List.fold_left f acc tl in
f acc hd
(* List.fold_left f acc (rev hdl) with some more tuple cons/decons *)
let reduce_left f (hd, tl) = List.fold_left f hd tl
let reduce_right f hdl = reduce_left f (rev hdl)
let fold_left_map f acc (hd, tl) =
let acc, hd = f acc hd in
let acc, tl = List.fold_left_map f acc tl in
acc, (hd, tl)
Jump to Line
Something went wrong with that request. Please try again.