diff --git a/otherlibs/stdune/src/list.ml b/otherlibs/stdune/src/list.ml index 93fa131738b..7ce0ea75ebc 100644 --- a/otherlibs/stdune/src/list.ml +++ b/otherlibs/stdune/src/list.ml @@ -273,3 +273,11 @@ let rec partition_three xs ~f = | `Middle y -> xs, y :: ys, zs | `Right z -> xs, ys, z :: zs) ;; + +module Assoc = struct + let rec find_exn xs x ~equal = + match xs with + | [] -> raise Not_found + | (x', y) :: xs -> if equal x x' then y else find_exn xs x ~equal + ;; +end diff --git a/otherlibs/stdune/src/list.mli b/otherlibs/stdune/src/list.mli index 238b44063c6..3473b9fed8d 100644 --- a/otherlibs/stdune/src/list.mli +++ b/otherlibs/stdune/src/list.mli @@ -74,3 +74,7 @@ val to_seq : 'a t -> 'a Seq.t (** [list_intersperse t ~sep] returns [t] with [sep] inserted between each pair of consecutive values. *) val intersperse : 'a t -> sep:'a -> 'a t + +module Assoc : sig + val find_exn : ('a * 'b) list -> 'a -> equal:('a -> 'a -> bool) -> 'b +end diff --git a/src/dune_sexp/decoder.ml b/src/dune_sexp/decoder.ml index 84b327dfd16..5439f27f71d 100644 --- a/src/dune_sexp/decoder.ml +++ b/src/dune_sexp/decoder.ml @@ -590,9 +590,9 @@ and find_cstr : type a. (string * a t) list -> Loc.t -> string -> values context -> values -> a = fun cstrs loc name ctx values -> - match List.assoc cstrs name with - | Some t -> result ctx (eval t ctx values) - | None -> + match List.Assoc.find_exn cstrs name ~equal:String.equal with + | t -> result ctx (eval t ctx values) + | exception Not_found -> User_error.raise ~loc ~hints:(User_message.did_you_mean name ~candidates:(List.map cstrs ~f:fst))