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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| (*
* Author: Damien Guichard (aka SpiceGuid)
* Created: 11 fev 2008
* Updated: 20 fev 2008
* License: Creative Commons http://creativecommons.org/licenses/by/3.0/
*)
module Seq = struct
(* not tail recursive *)
let fold f init l =
let rec helper l =
match l with
| [] -> init
| a::l -> f (helper l) a
in helper l
let rec rev_fold f init l =
match l with
| [] -> init
| a::l -> rev_fold f (f init a) l
(* not tail recursive *)
let fold2 f init l1 l2 =
let rec helper l1 l2 =
match l1 , l2 with
| [], [] -> Some init
| a1::l1 , a2::l2 ->
( match helper l1 l2 with
| None -> None
| Some h -> Some (f h a1 a2)
)
| _ , _ -> None
in helper l1 l2
let rec rev_fold2 f init l1 l2 =
match l1 , l2 with
| [] , [] -> Some init
| a1::l1 , a2::l2 -> rev_fold2 f (f init a1 a2) l1 l2
| _ , _ -> None
let range a b =
let rec loop n acc =
if n = a then a::acc
else loop (pred n) (n::acc)
in if a <= b then loop b [] else []
let rec last l =
match l with
| [] -> None
| [a] -> Some a
| a::l -> last l
(* not tail recursive *)
let rec poset l =
match l with
| [] -> [[]]
| a::l ->
let t = poset l
in List.rev_append (List.rev_map (fun x -> a::x) t) t
(* not tail recursive *)
let mapi f n l =
let rec helper n l =
match l with
| [] -> []
| h::t -> (f n h)::helper (succ n) t
in helper n l
let rev_mapi f n l =
let rec loop n l acc =
match l with
| [] -> acc
| h::t -> loop (succ n) t (f n h::acc)
in loop n l []
(* not tail recursive *)
let rev_iter f l =
let rec helper l =
match l with
| [] -> ()
| a::l -> helper l; f a
in helper l
let rev_filter p l =
let rec loop l acc =
match l with
| [] -> acc
| h::t ->
if p h then loop t (h::acc)
else loop t acc
in loop l []
let rev_append_map_filter p f l1 l2 =
let rec loop l acc =
match l with
| [] -> acc
| h::t ->
if p h then loop t (f h::acc)
else loop t acc
in loop l1 l2
let exists_product p l =
let rec loop l =
match l with
| [] -> false
| h::t -> (exists (p h) t) or loop t
in loop l
(* not tail recursive *)
let filter_product p l1 l2 =
let rec helper l =
match l with
| [] -> []
| a::l -> rev_append_map_filter (p a) (fun b -> a,b) l2 (helper l)
in helper l1
let filter_circular p l =
let rec loop prev l acc =
match l with
| [] -> acc
| h::t ->
if p prev h then loop h t ((prev,h)::acc)
else loop h t acc
in match last l with
| None -> []
| Some a -> loop a l []
let lexicographical (cmp: 'a ->'a->int) l1 l2 =
let rec loop l1 l2 =
match l1,l2 with
| [],[] -> 0
| [],_ -> -1
| _,[] -> 1
| a::t1,b::t2 ->
let r = cmp a b in
if r = 0 then loop t1 t2
else r
in loop l1 l2
let of_string s =
let rec loop n acc =
if n < 0 then acc
else loop (pred n) (s.[n]::acc)
in loop (String.length s - 1) []
end;; |
Partager