import type { Option } from "../Option"; import * as O from "../Option"; import type { ReadonlyRecord } from "./model"; import { keys } from "./utils"; const hasOwnProperty_ = Object.prototype.hasOwnProperty; export const collect_ = (r: ReadonlyRecord, f: (k: N, a: A) => B) => { const out: Array = []; const ks = keys(r); for (let i = 0; i < ks.length; i++) { const key = ks[i]; out.push(f(key, r[key])); } return out; }; export const collect = (f: (k: N, a: A) => B) => (r: ReadonlyRecord) => collect_(r, f); export const insertAt_ = ( r: ReadonlyRecord, k: K, a: A ): ReadonlyRecord => { if (r[k as any] === a) { return r as any; } const out: Record = Object.assign({}, r) as any; out[k] = a; return out; }; export const insertAt = (k: K, a: A) => (r: ReadonlyRecord) => insertAt_(r, k, a); export const deleteAt_ = ( r: ReadonlyRecord, k: K ): ReadonlyRecord, A> => { if (!hasOwnProperty_.call(r, k)) { return r; } const out: Record = Object.assign({}, r); delete out[k as any]; return out as any; }; export const deleteAt = (k: K) => (r: ReadonlyRecord) => deleteAt_(r, k); export const updateAt_ = (r: ReadonlyRecord, k: N, a: A) => { if (!hasOwnProperty_.call(r, k)) { return O.none(); } if (r[k] === a) { return O.some(r); } const out: Record = Object.assign({}, r); out[k] = a; return O.some(out); }; export const updateAt = (k: N, a: A) => (r: ReadonlyRecord) => updateAt_(r, k, a); export const modifyAt_ = (r: ReadonlyRecord, k: N, f: (a: A) => A) => { if (!hasOwnProperty_.call(r, k)) { return O.none(); } const out: Record = Object.assign({}, r); out[k] = f(r[k]); return O.some(out); }; export const modifyAt = (k: N, f: (a: A) => A) => (r: ReadonlyRecord) => modifyAt_(r, k, f); export const lookup_ = (r: ReadonlyRecord, k: N): Option => hasOwnProperty_.call(r, k) ? O.some(r[k]) : O.none(); export const lookup = (k: N) => (r: ReadonlyRecord) => lookup_(r, k); export const pop_ = ( r: ReadonlyRecord, k: K ): Option, A>]> => { const deleteAtk = deleteAt(k); const oa = lookup(k)(r); return O.isNone(oa) ? O.none() : O.some([oa.value, deleteAtk(r)]); }; export const pop = (k: K) => (r: ReadonlyRecord) => pop_(r, k);