import type * as P from "@principia/prelude"; import * as HKT from "@principia/prelude/HKT"; import type { URI, V } from "./model"; interface Next { readonly done?: boolean; readonly value: A; } /* * ------------------------------------------- * Functor Map * ------------------------------------------- */ /** * Maps values using f */ export const mapWithIndex_ = (fa: ReadonlyMap, f: (k: K, a: A) => B): ReadonlyMap => { const m = new Map(); const entries = fa.entries(); let e: Next; while (!(e = entries.next()).done) { const [key, a] = e.value; m.set(key, f(key, a)); } return m; }; /** * Maps values using f */ export const mapWithIndex = (f: (k: K, a: A) => B) => (fa: ReadonlyMap): ReadonlyMap => mapWithIndex_(fa, f); /** * Maps values using f */ export const map_ = (fa: ReadonlyMap, f: (a: A) => B): ReadonlyMap => mapWithIndex_(fa, (_, a) => f(a)); /** * Maps values using f */ export const map = (f: (a: A) => B) => (fa: ReadonlyMap): ReadonlyMap => map_(fa, f); /** * @category Functor * @since 1.0.0 */ export const Functor: P.Functor<[URI], V> = HKT.instance({ map, map_: map_ }); /** * @category FunctorWithIndex * @since 1.0.0 */ export const FunctorWithIndex: P.FunctorWithIndex<[URI], V> = HKT.instance({ mapWithIndex, mapWithIndex_: mapWithIndex_ });