From 69c4f089bda2d88f38248b818eea9686b137e787 Mon Sep 17 00:00:00 2001 From: Josh Berdine Date: Mon, 28 Jun 2021 03:34:10 -0700 Subject: [PATCH] [sledge] Add Array.of_list_map Reviewed By: ngorogiannis Differential Revision: D28907815 fbshipit-source-id: 40ed1f29e --- sledge/nonstdlib/array.ml | 13 +++++++++++++ sledge/nonstdlib/array.mli | 1 + 2 files changed, 14 insertions(+) diff --git a/sledge/nonstdlib/array.ml b/sledge/nonstdlib/array.ml index 282e6b861..7e45a2eca 100644 --- a/sledge/nonstdlib/array.ml +++ b/sledge/nonstdlib/array.ml @@ -27,6 +27,19 @@ let of_list_rev = function in back_fill (len - 2) tl +let of_list_map xs ~f = + match xs with + | [] -> [||] + | hd :: tl -> + let a = make (1 + List.length tl) (f hd) in + let rec fill i = function + | [] -> a + | hd :: tl -> + unsafe_set a i (f hd) ; + fill (i + 1) tl + in + fill 1 tl + let is_empty = function [||] -> true | _ -> false let map xs ~f = map ~f xs let mapi xs ~f = mapi ~f xs diff --git a/sledge/nonstdlib/array.mli b/sledge/nonstdlib/array.mli index 06fc28d8c..a4e113f9f 100644 --- a/sledge/nonstdlib/array.mli +++ b/sledge/nonstdlib/array.mli @@ -13,6 +13,7 @@ type 'a t = 'a array [@@deriving compare, equal, sexp] val of_ : 'a -> 'a t val of_iter : 'a iter -> 'a t val of_list_rev : 'a list -> 'a t +val of_list_map : 'a list -> f:('a -> 'b) -> 'b t val map : 'a t -> f:('a -> 'b) -> 'b t val mapi : 'a t -> f:(int -> 'a -> 'b) -> 'b t