Blame src/refList.ml

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