diff --git a/src/lib.ml b/src/lib.ml index 11f44df5..07356f57 100644 --- a/src/lib.ml +++ b/src/lib.ml @@ -874,16 +874,10 @@ and closure_with_overlap_checks db ts ~stack = >>= fun () -> Dep_stack.push stack (to_id t) >>= fun stack -> t.requires >>= fun deps -> - iter deps ~stack >>| fun () -> + Result.iter deps ~f:(loop ~stack) >>| fun () -> res := t :: !res - and iter ts ~stack = - match ts with - | [] -> Ok () - | t :: ts -> - loop t ~stack >>= fun () -> - iter ts ~stack in - iter ts ~stack >>| fun () -> + Result.iter ts ~f:(loop ~stack) >>| fun () -> List.rev !res let closure_with_overlap_checks db l = diff --git a/src/stdune/result.ml b/src/stdune/result.ml index 47b3f882..0cb8a7ca 100644 --- a/src/stdune/result.ml +++ b/src/stdune/result.ml @@ -59,4 +59,11 @@ let concat_map = in fun l ~f -> loop f [] l +let rec iter t ~f = + match t with + | [] -> Ok () + | x :: xs -> + f x >>= fun () -> + iter xs ~f + type ('a, 'error) result = ('a, 'error) t diff --git a/src/stdune/result.mli b/src/stdune/result.mli index 7e0467ca..70ec345d 100644 --- a/src/stdune/result.mli +++ b/src/stdune/result.mli @@ -23,6 +23,8 @@ val map_error : ('a, 'error1) t -> f:('error1 -> 'error2) -> ('a, 'error2) t val all : ('a, 'error) t list -> ('a list, 'error) t +val iter : 'a list -> f:('a -> (unit, 'error) t) -> (unit, 'error) t + val concat_map : 'a list -> f:('a -> ('b list, 'error) t)