import { Error, List, Ok, inspect, toList, makeError, isEqual, } from "./gleam.mjs"; import * as $option from "../gleam_stdlib/gleam/option.mjs"; const HASHCODE_CACHE = new WeakMap(); const Nil = undefined; class MutableMap { static #hashcode_cache = new WeakMap(); static hash(value) { let existing = this.#hashcode_cache.get(value); if (existing) { return existing; } else if (value instanceof Object) { let hashcode = inspect(value); HASHCODE_CACHE.set(value, hashcode); return hashcode; } else { return value.toString(); } } constructor() { this.entries = new globalThis.Map(); } get size() { return this.entries.size; } inspect() { let entries = [...this.entries.values()] .map((pair) => inspect(pair)) .join(", "); return `map.from_list([${entries}])`; } toList() { return List.fromArray([...this.entries.values()]); } insert(k, v) { this.entries.set(MutableMap.hash(k), [k, v]); return this; } delete(k) { this.entries.delete(MutableMap.hash(k)); return this; } get(key) { let code = MutableMap.hash(key); if (this.entries.has(code)) { return new Ok(this.entries.get(code)[1]); } else { return new Error(Nil); } } } export function new_mutable_map() { return new MutableMap(); } export function mutable_map_size(map) { return map.size; } export function mutable_map_to_list(map) { return map.toList(); } export function mutable_map_remove(k, map) { return map.delete(k); } export function mutable_map_get(map, key) { return map.get(key); } export function mutable_map_insert(key, value, map) { return map.insert(key, value); } // From map.mjs export function size(map) { return mutable_map_size(map); } export function to_list(map) { return mutable_map_to_list(map); } export function new$() { return new_mutable_map(); } export function get(from, get) { return mutable_map_get(from, get); } function do_has_key(key, map) { return !isEqual(get(map, key), new Error(undefined)); } export function has_key(map, key) { return do_has_key(key, map); } export function insert(map, key, value) { return mutable_map_insert(key, value, map); } function insert_pair(map, pair) { return insert(map, pair[0], pair[1]); } export function update(map, key, fun) { let _pipe = map; let _pipe$1 = get(_pipe, key); let _pipe$2 = $option.from_result(_pipe$1); let _pipe$3 = fun(_pipe$2); return ((_capture) => { return insert(map, key, _capture); })(_pipe$3); } export function delete$(map, key) { return mutable_map_remove(key, map); } function fold_list_of_pair(loop$list, loop$initial) { while (true) { let list = loop$list; let initial = loop$initial; if (list.hasLength(0)) { return initial; } else if (list.atLeastLength(1)) { let x = list.head; let rest = list.tail; loop$list = rest; loop$initial = insert(initial, x[0], x[1]); } else { throw makeError( "case_no_match", "gleam/map", 98, "fold_list_of_pair", "No case clause matched", { values: [list] } ); } } } function do_from_list(list) { return fold_list_of_pair(list, new$()); } export function from_list(list) { return do_from_list(list); } function do_fold(loop$list, loop$initial, loop$fun) { while (true) { let list = loop$list; let initial = loop$initial; let fun = loop$fun; if (list.hasLength(0)) { return initial; } else if (list.atLeastLength(1)) { let k = list.head[0]; let v = list.head[1]; let tail = list.tail; loop$list = tail; loop$initial = fun(initial, k, v); loop$fun = fun; } else { throw makeError( "case_no_match", "gleam/map", 558, "do_fold", "No case clause matched", { values: [list] } ); } } } export function fold(map, initial, fun) { let _pipe = map; let _pipe$1 = to_list(_pipe); return do_fold(_pipe$1, initial, fun); } function do_map_values(f, map) { let f$1 = (map, k, v) => { return insert(map, k, f(k, v)); }; let _pipe = map; return fold(_pipe, new$(), f$1); } export function map_values(map, fun) { return do_map_values(fun, map); } function do_filter(f, map) { let insert$1 = (map, k, v) => { let $ = f(k, v); if ($) { return insert(map, k, v); } else { return map; } }; let _pipe = map; return fold(_pipe, new$(), insert$1); } export function filter(map, property) { return do_filter(property, map); } function do_keys_acc(loop$list, loop$acc) { while (true) { let list = loop$list; let acc = loop$acc; if (list.hasLength(0)) { return reverse_and_concat(acc, toList([])); } else if (list.atLeastLength(1)) { let x = list.head; let xs = list.tail; loop$list = xs; loop$acc = toList([x[0]], acc); } else { throw makeError( "case_no_match", "gleam/map", 276, "do_keys_acc", "No case clause matched", { values: [list] } ); } } } function do_keys(map) { let list_of_pairs = (() => { let _pipe = map; return to_list(_pipe); })(); return do_keys_acc(list_of_pairs, toList([])); } export function keys(map) { return do_keys(map); } function reverse_and_concat(loop$remaining, loop$accumulator) { while (true) { let remaining = loop$remaining; let accumulator = loop$accumulator; if (remaining.hasLength(0)) { return accumulator; } else if (remaining.atLeastLength(1)) { let item = remaining.head; let rest = remaining.tail; loop$remaining = rest; loop$accumulator = toList([item], accumulator); } else { throw makeError( "case_no_match", "gleam/map", 269, "reverse_and_concat", "No case clause matched", { values: [remaining] } ); } } } function do_values_acc(loop$list, loop$acc) { while (true) { let list = loop$list; let acc = loop$acc; if (list.hasLength(0)) { return reverse_and_concat(acc, toList([])); } else if (list.atLeastLength(1)) { let x = list.head; let xs = list.tail; loop$list = xs; loop$acc = toList([x[1]], acc); } else { throw makeError( "case_no_match", "gleam/map", 314, "do_values_acc", "No case clause matched", { values: [list] } ); } } } function do_values(map) { let list_of_pairs = (() => { let _pipe = map; return to_list(_pipe); })(); return do_values_acc(list_of_pairs, toList([])); } export function values(map) { return do_values(map); } function insert_taken(loop$map, loop$desired_keys, loop$acc) { while (true) { let map = loop$map; let desired_keys = loop$desired_keys; let acc = loop$acc; let insert$1 = (taken, key) => { let $ = get(map, key); if ($.isOk()) { let value = $[0]; return insert(taken, key, value); } else { return taken; } }; if (desired_keys.hasLength(0)) { return acc; } else if (desired_keys.atLeastLength(1)) { let x = desired_keys.head; let xs = desired_keys.tail; loop$map = map; loop$desired_keys = xs; loop$acc = insert$1(acc, x); } else { throw makeError( "case_no_match", "gleam/map", 411, "insert_taken", "No case clause matched", { values: [desired_keys] } ); } } } function do_take(desired_keys, map) { return insert_taken(map, desired_keys, new$()); } export function take(map, desired_keys) { return do_take(desired_keys, map); } function fold_inserts(loop$new_entries, loop$map) { while (true) { let new_entries = loop$new_entries; let map = loop$map; if (new_entries.hasLength(0)) { return map; } else if (new_entries.atLeastLength(1)) { let x = new_entries.head; let xs = new_entries.tail; loop$new_entries = xs; loop$map = insert_pair(map, x); } else { throw makeError( "case_no_match", "gleam/map", 451, "fold_inserts", "No case clause matched", { values: [new_entries] } ); } } } function do_merge(map, new_entries) { let _pipe = new_entries; let _pipe$1 = to_list(_pipe); return fold_inserts(_pipe$1, map); } export function merge(map, new_entries) { return do_merge(map, new_entries); } export function drop(loop$map, loop$disallowed_keys) { while (true) { let map = loop$map; let disallowed_keys = loop$disallowed_keys; if (disallowed_keys.hasLength(0)) { return map; } else if (disallowed_keys.atLeastLength(1)) { let x = disallowed_keys.head; let xs = disallowed_keys.tail; loop$map = delete$(map, x); loop$disallowed_keys = xs; } else { throw makeError( "case_no_match", "gleam/map", 514, "drop", "No case clause matched", { values: [disallowed_keys] } ); } } }