struct
  let unopt = function
    | None   -> failwith "Cannot unopt None"
    | Some v -> v

  module Array =
  struct
    let fold_left2 = fun f init a1 a2 ->
      if Array.length a1 <> Array.length a2 then
        invalid_arg "Misc.Array.fold_left2: arrays don't have same size";
      let result = ref init in
        for i = 0 to (Array.length a1) - 1 do
          result := f !result a1.(i) a2.(i)
        done;
        !result

    let combine = fun a1 a2 ->
      if Array.length a1 <> Array.length a2 then
        invalid_arg "Misc.Array.combine: arrays don't have same size";
      Array.init (Array.length a1) (fun i -> (a1.(i), a2.(i)))
  end
end