Skip to content

Instantly share code, notes, and snippets.

@joelonsql
Last active December 27, 2018 15:42
Show Gist options
  • Save joelonsql/785ba339da3f709b47f77ea2fdcab8ad to your computer and use it in GitHub Desktop.
Save joelonsql/785ba339da3f709b47f77ea2fdcab8ad to your computer and use it in GitHub Desktop.
(* Original OCaml code: *)
let flatten_transitions : StateSet.t CharSetMap.t -> StateSet.t CharMap.t =
fun char_map ->
CharSetMap.fold
(fun char_set state_set char_map ->
CharSet.fold
(fun char char_map ->
let entry = match CharMap.find char char_map with
| exception Not_found -> StateSet.empty
| state_set -> state_set in
CharMap.add char (StateSet.union state_set entry) char_map)
char_set
char_map)
char_map
CharMap.empty
(* Reason code produced by bsrefmt from OCaml: *)
let flatten_transitions: CharSetMap.t(StateSet.t) => CharMap.t(StateSet.t) =
char_map =>
CharSetMap.fold(
(char_set, state_set, char_map) =>
CharSet.fold(
(char, char_map) => {
let entry =
switch (CharMap.find(char, char_map)) {
| exception Not_found => StateSet.empty
| state_set => state_set
};
CharMap.add(char, StateSet.union(state_set, entry), char_map);
},
char_set,
char_map,
),
char_map,
CharMap.empty,
);
(* Looks nice! But not so nice when trying to convert back to OCaml from Reason using bsrefmt: *)
let flatten_transitions: StateSet.t CharSetMap.t -> StateSet.t CharMap.t =
fun char_map ->
CharSetMap.fold
(fun char_set ->
fun state_set ->
fun char_map ->
CharSet.fold
(fun char ->
fun char_map ->
let entry =
match CharMap.find char char_map with
| exception Not_found -> StateSet.empty
| state_set -> state_set in
CharMap.add char (StateSet.union state_set entry)
char_map) char_set char_map) char_map CharMap.empty
(* Which is the same thing, but doesn't look very nice. *)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment