|
rpm-build |
0f2925 |
(*
|
|
rpm-build |
0f2925 |
* RefList - List reference
|
|
rpm-build |
0f2925 |
* Copyright (C) 2003 Nicolas Cannasse
|
|
rpm-build |
0f2925 |
*
|
|
rpm-build |
0f2925 |
* This library is free software; you can redistribute it and/or
|
|
rpm-build |
0f2925 |
* modify it under the terms of the GNU Lesser General Public
|
|
rpm-build |
0f2925 |
* License as published by the Free Software Foundation; either
|
|
rpm-build |
0f2925 |
* version 2.1 of the License, or (at your option) any later version,
|
|
rpm-build |
0f2925 |
* with the special exception on linking described in file LICENSE.
|
|
rpm-build |
0f2925 |
*
|
|
rpm-build |
0f2925 |
* This library is distributed in the hope that it will be useful,
|
|
rpm-build |
0f2925 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
rpm-build |
0f2925 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
rpm-build |
0f2925 |
* Lesser General Public License for more details.
|
|
rpm-build |
0f2925 |
*
|
|
rpm-build |
0f2925 |
* You should have received a copy of the GNU Lesser General Public
|
|
rpm-build |
0f2925 |
* License along with this library; if not, write to the Free Software
|
|
rpm-build |
0f2925 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
rpm-build |
0f2925 |
*)
|
|
rpm-build |
0f2925 |
open ExtList
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
exception Empty_list
|
|
rpm-build |
0f2925 |
exception Invalid_index of int
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
type 'a t = 'a list ref
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let empty () = ref []
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let is_empty x =
|
|
rpm-build |
0f2925 |
match !x with
|
|
rpm-build |
0f2925 |
| [] -> true
|
|
rpm-build |
0f2925 |
| _ -> false
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let of_list l = ref l
|
|
rpm-build |
0f2925 |
let to_list rl = !rl
|
|
rpm-build |
0f2925 |
let copy ~dst ~src = dst := !src
|
|
rpm-build |
0f2925 |
let copy_list ~dst ~src = dst := src
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let add rl item = rl := List.append !rl [item]
|
|
rpm-build |
0f2925 |
let push rl item = rl := item::!rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let clear rl = rl := []
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let length rl = List.length !rl
|
|
rpm-build |
0f2925 |
let hd rl = try List.hd !rl with _ -> raise Empty_list
|
|
rpm-build |
0f2925 |
let tl rl = try ref (List.tl !rl) with _ -> raise Empty_list
|
|
rpm-build |
0f2925 |
let iter f rl = List.iter f !rl
|
|
rpm-build |
0f2925 |
let for_all f rl = List.for_all f !rl
|
|
rpm-build |
0f2925 |
let map f rl = ref (List.map f !rl)
|
|
rpm-build |
0f2925 |
let transform f rl = rl := List.map f !rl
|
|
rpm-build |
0f2925 |
let map_list f rl = List.map f !rl
|
|
rpm-build |
0f2925 |
let find f rl = List.find f !rl
|
|
rpm-build |
0f2925 |
let rev rl = rl := List.rev !rl
|
|
rpm-build |
0f2925 |
let find_exc f exn rl = try List.find f !rl with _ -> raise exn
|
|
rpm-build |
0f2925 |
let exists f rl = List.exists f !rl
|
|
rpm-build |
0f2925 |
let sort ?(cmp=compare) rl = rl := List.sort ~cmp !rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let rfind f rl = List.rfind f !rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let first = hd
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let last rl =
|
|
rpm-build |
0f2925 |
let rec loop = function
|
|
rpm-build |
0f2925 |
| x :: [] -> x
|
|
rpm-build |
0f2925 |
| x :: l -> loop l
|
|
rpm-build |
0f2925 |
| [] -> assert false
|
|
rpm-build |
0f2925 |
in
|
|
rpm-build |
0f2925 |
match !rl with
|
|
rpm-build |
0f2925 |
| [] -> raise Empty_list
|
|
rpm-build |
0f2925 |
| l -> loop l
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let remove rl item = rl := List.remove !rl item
|
|
rpm-build |
0f2925 |
let remove_if pred rl = rl := List.remove_if pred !rl
|
|
rpm-build |
0f2925 |
let remove_all rl item = rl := List.remove_all !rl item
|
|
rpm-build |
0f2925 |
let filter pred rl = rl := List.filter pred !rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let add_sort ?(cmp=compare) rl item =
|
|
rpm-build |
0f2925 |
let rec add_aux = function
|
|
rpm-build |
0f2925 |
| x::lnext as l ->
|
|
rpm-build |
0f2925 |
let r = cmp x item in
|
|
rpm-build |
0f2925 |
if r < 0 then item::l else x::(add_aux lnext)
|
|
rpm-build |
0f2925 |
| [] -> [item]
|
|
rpm-build |
0f2925 |
in
|
|
rpm-build |
0f2925 |
rl := add_aux !rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let pop rl =
|
|
rpm-build |
0f2925 |
match !rl with
|
|
rpm-build |
0f2925 |
| [] -> raise Empty_list
|
|
rpm-build |
0f2925 |
| e::l -> rl := l; e
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let npop rl n =
|
|
rpm-build |
0f2925 |
let rec pop_aux l n =
|
|
rpm-build |
0f2925 |
if n = 0 then begin
|
|
rpm-build |
0f2925 |
rl := l;
|
|
rpm-build |
0f2925 |
[]
|
|
rpm-build |
0f2925 |
end else
|
|
rpm-build |
0f2925 |
match l with
|
|
rpm-build |
0f2925 |
| [] -> raise Empty_list
|
|
rpm-build |
0f2925 |
| x::l -> x::(pop_aux l (n-1))
|
|
rpm-build |
0f2925 |
in
|
|
rpm-build |
0f2925 |
pop_aux !rl n
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let copy_enum ~dst ~src = dst := List.of_enum src
|
|
rpm-build |
0f2925 |
let enum rl = List.enum !rl
|
|
rpm-build |
0f2925 |
let of_enum e = ref (List.of_enum e)
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
module Index = struct
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let remove_at rl pos =
|
|
rpm-build |
0f2925 |
let p = ref (-1) in
|
|
rpm-build |
0f2925 |
let rec del_aux = function
|
|
rpm-build |
0f2925 |
| x::l -> incr p; if !p = pos then l else x::(del_aux l)
|
|
rpm-build |
0f2925 |
| [] -> raise (Invalid_index pos)
|
|
rpm-build |
0f2925 |
in
|
|
rpm-build |
0f2925 |
rl := del_aux !rl
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let index pred rl =
|
|
rpm-build |
0f2925 |
let index = ref (-1) in
|
|
rpm-build |
0f2925 |
List.find (fun it -> incr index; pred it; ) !rl;
|
|
rpm-build |
0f2925 |
!index
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let index_of rl item =
|
|
rpm-build |
0f2925 |
let index = ref (-1) in
|
|
rpm-build |
0f2925 |
List.find (fun it -> incr index; it = item; ) !rl;
|
|
rpm-build |
0f2925 |
!index
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let at_index rl pos =
|
|
rpm-build |
0f2925 |
try
|
|
rpm-build |
0f2925 |
List.nth !rl pos
|
|
rpm-build |
0f2925 |
with
|
|
rpm-build |
0f2925 |
_ -> raise (Invalid_index pos)
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
let set rl pos newitem =
|
|
rpm-build |
0f2925 |
let p = ref (-1) in
|
|
rpm-build |
0f2925 |
rl := List.map (fun item -> incr p; if !p = pos then newitem else item) !rl;
|
|
rpm-build |
0f2925 |
if !p < pos || pos < 0 then raise (Invalid_index pos)
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
|
|
rpm-build |
0f2925 |
end
|