import { curried } from "@tsplus/stdlib/prelude/DSL/_internal/curried" function getRecordConstructor(keys: ReadonlyArray) { const len = keys.length return curried( (...args: ReadonlyArray) => { const r: Record = {} for (let i = 0; i < len; i++) { r[keys[i]!] = args[i] } return r }, len - 1, [] ) } /** * @tsplus static DSL structF */ export function structF(F: Apply) { return >>( r: EnforceNonEmptyRecord ): HKT.Kind< F, HKT.Infer, HKT.Infer, { [K in keyof NER]: HKT.Infer } > => { const ap = DSL.apF(F) const keys = Object.keys(r) const len = keys.length const f = getRecordConstructor(keys) let fr = F.map(f)(r[keys[0]!]!) for (let i = 1; i < len; i++) { fr = ap(r[keys[i]!]!)(fr) } return fr } }