packages feed

alms-0.4.9: lib/libarray.alms

(*
  An array library.
*)

module Array : sig
  exception ArrayIndex
  type `a array = `a Prim.Array.array

  val build    : all `a. int -> (int -> `a) -> `a array
  val swap     : all `a. `a array -> int -> `a -> `a
  val set      : all `a. `a array -> int -> `a -> unit
  val size     : all `a. `a array -> int

  (* Unlimited-only operations *)
  val new      : all 'a. int -> 'a -> 'a array
  val get      : all 'a. 'a array -> int -> 'a
end = struct
  open Prim.Array

  exception ArrayIndex
  type `a array = `a Prim.Array.array

  let new['a] (size : int) (elt : 'a) =
    build size (fun (_: int) -> elt)

  let swap[`a] (a : `a array) (ix : int) (elt : `a) =
    try swap a ix elt
    with _ -> raise ArrayIndex

  let set[`a] (a : `a array) (ix : int) (elt : `a) =
    swap a ix elt; ()
end