source: Deliverables/D2.2/8051/src/utilities/miscPottier.ml @ 486

Last change on this file since 486 was 486, checked in by ayache, 9 years ago

Deliverable D2.2

File size: 1.9 KB
Line 
1
2let rec make a n =
3  if n = 0 then []
4  else a :: (make a (n-1))
5
6let index_of x =
7  let rec aux i = function
8    | [] -> raise Not_found
9    | y :: l -> if y = x then i else aux (i+1) l
10  in
11  aux 0
12
13let foldi f a =
14  let rec aux i res = function
15    | [] -> res
16    | e :: l -> aux (i+1) (f i res e) l
17  in
18  aux 0 a
19
20let iteri f l =
21  let rec aux i = function
22    | [] -> ()
23    | e :: l -> f i e ; aux (i+1) l
24  in
25  aux 0 l
26
27let mapi f l =
28  let rec aux i = function
29    | [] -> []
30    | e :: l -> (f i e) :: (aux (i+1) l)
31  in
32  aux 0 l
33
34(* [split a i] splits the list a in two lists: one with the elements
35   up until the [i]th (exclusive) and one with the rest. *)
36
37let rec split l i =
38  if i = 0 then ([], l)
39  else
40    let (l1, l2) = split (List.tl l) (i-1) in
41    ((List.hd l) :: l1, l2)
42
43let rec update_list_assoc a b = function
44  | [] -> []
45  | (a', b') :: l ->
46      if a' = a then (a, b) :: l else (a', b') :: (update_list_assoc a b l)
47
48(* Pasted from Pottier's PP compiler *)
49
50let rec combine xs1 xs2 =
51  match xs1, xs2 with
52  | [], _
53  | _, [] ->
54      []
55  | x1 :: xs1, x2 :: xs2 ->
56      (x1, x2) :: combine xs1 xs2
57
58let rec subtract xs1 xs2 =
59  match xs1, xs2 with
60  | [], _ ->
61      []
62  | _, [] ->
63      xs1
64  | _ :: xs1, _ :: xs2 ->
65      subtract xs1 xs2
66
67let mirror l =
68  List.map (fun (x, y) -> (y, x)) l
69
70let length l =
71  Int32.of_int (List.length l)
72
73let rec prefix k l =
74  match k, l with
75  | 0, _
76  | _, [] ->
77      []
78  | _, x :: xs ->
79      x :: prefix (k - 1) xs
80
81let memoize f =
82  let table = Hashtbl.create 131 in
83  fun key ->
84    try
85      Hashtbl.find table key
86    with Not_found ->
87      let data = f key in
88      Hashtbl.add table key data;
89      data
90
91let filter_map filter map =
92  let rec aux = function
93    | [] -> []
94    | e :: l -> (if filter e then [map e] else []) @ (aux l)
95  in
96  aux
97
98let string_of_list sep f =
99  let rec aux = function
100    | [] -> ""
101    | [e] -> f e
102    | e :: l -> (f e) ^ sep ^ (aux l)
103  in
104  aux
Note: See TracBrowser for help on using the repository browser.