-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathassoc.ts
53 lines (41 loc) · 1.58 KB
/
assoc.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Copyright (c) 2020 Jozty. All rights reserved. MIT license.
import type { ObjRec, PH } from './utils/types.ts';
import curryN from './utils/curry_n.ts';
// @types
type Assoc_1 = (prop: string | number) => ObjRec;
type Assoc_2 = (val: unknown) => ObjRec;
type Assoc_3 = (obj: ObjRec) => ObjRec;
type Assoc_2_3 =
& ((val: PH, obj: ObjRec) => Assoc_2)
& ((val: unknown) => Assoc_3)
& ((val: unknown, obj: ObjRec) => ObjRec);
type Assoc_1_3 =
& ((prop: PH, obj: ObjRec) => Assoc_1)
& ((prop: string | number) => Assoc_3)
& ((prop: string | number, obj: ObjRec) => ObjRec);
type Assoc_1_2 =
& ((prop: PH, val: unknown) => Assoc_1)
& ((prop: string | number) => Assoc_2)
& ((prop: string | number, val: unknown) => ObjRec);
type Assoc =
& ((prop: string | number) => Assoc_2_3)
& ((prop: PH, val: unknown) => Assoc_1_3)
& ((prop: PH, val: PH, obj: ObjRec) => Assoc_1_2)
& ((prop: string | number, val: unknown) => Assoc_3)
& ((prop: string | number, val: PH, obj: ObjRec) => Assoc_2)
& ((prop: PH, val: unknown, obj: ObjRec) => Assoc_1)
& ((prop: string | number, val: unknown, obj: ObjRec) => ObjRec);
function _assoc(prop: string | number, val: unknown, obj: ObjRec) {
const result: ObjRec = {};
for (const p in obj) result[p] = obj[p];
result[prop] = val;
return result;
}
/**
* Makes a shallow clone of `obj`, setting or overriding the specified
* property `prop` with the given `val`. All non-primitive properties are
* copied by reference.
*
* Fae.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
*/
export const assoc = curryN(3, _assoc) as Assoc;