import type { Foldable, Semigroup } from "@principia/prelude"; import type { Eq } from "@principia/prelude/Eq"; import type * as HKT from "@principia/prelude/HKT"; import { pipe } from "../Function"; import { lookupWithKey_ } from "./combinators"; export const empty: ReadonlyMap = new Map(); /** * Create from a key-value array */ export const make = (values: ReadonlyArray): ReadonlyMap => new Map(values); /** * Construct a new Readonly Map */ export const fromMutable = (m: Map): ReadonlyMap => new Map(m); /** * Create a map with one key/value pair */ export const singleton = (k: K, a: A): ReadonlyMap => new Map([[k, a]]); export const fromFoldable = (E: Eq, S: Semigroup, F: Foldable) => < N extends string, K_, Q, W, X, I, S, R, E >( fka: HKT.Kind ): ReadonlyMap => { const lookupWithKeyE_ = lookupWithKey_(E); return pipe( fka, F.reduce(new Map(), (b, [k, a]) => { const oka = lookupWithKeyE_(b, k); if (oka._tag === "Some") { b.set(oka.value[0], S.combine_(oka.value[1], a)); } else { b.set(k, a); } return b; }) ); };