-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathtest.ts
80 lines (68 loc) · 2.11 KB
/
test.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { equal, deepEqual } from 'assert';
import { lens } from '../src/';
type Person = {
name: string,
age: number,
accounts: Array<Account>
};
type Account = {
type: string;
handle: string;
};
const azusa: Person = {
name: 'Nakano Azusa',
age: 15,
accounts: [
{
type: 'twitter',
handle: '@azusa'
},
{
type: 'facebook',
handle: 'nakano.azusa'
}
]
};
const personL = lens<Person>();
const getPerson = personL.get();
deepEqual(getPerson(azusa), azusa);
equal(
personL.compose(lens<Person>().k('name')).get()(azusa),
'Nakano Azusa'
);
const twitterL = personL.k('accounts').k(0).k('handle');
const getTwitterHandle = twitterL.get();
equal(getTwitterHandle(azusa), '@azusa');
// property lens test with composition
equal(
personL.k('accounts').compose(lens<Account[]>().k(1)).k('handle').get()(azusa),
'nakano.azusa'
);
// set with value
const nthHandle = (n: number) => personL.k('accounts').k(n).k('handle');
const get1stHandle = nthHandle(1).get();
const set1stHandle = nthHandle(1).set('中野梓');
equal(get1stHandle(set1stHandle(azusa)), '中野梓');
equal(get1stHandle(azusa), 'nakano.azusa'); // immutablility test
// set with modify function
const reverseName = personL.k('name').set(name => {
const [sur, given] = name.split(' ');
return `${given} ${sur}`;
});
equal(reverseName(azusa).name, 'Azusa Nakano');
equal(azusa.name, 'Nakano Azusa'); // immutablility test
const azusa___ = personL.k('accounts').set(xs => xs.concat([{
type: 'instagram',
handle: 'nakano.azusa',
}]))(azusa);
equal(personL.k('accounts').k('length').get()(azusa), 2);
equal(personL.k('accounts').k('length').get()(azusa___), 3);
// get with map function
const accountTypes = personL.k('accounts').get(xs => xs.map(x => x.type));
deepEqual(accountTypes(azusa___), ['twitter', 'facebook', 'instagram']);
// getter/setter composition
const firstAccountL = lens<Person>().k('accounts').k(0);
const accountHandleL = lens<Account>().k('handle');
const setter = firstAccountL.set(accountHandleL.set('yui'));
const getter = firstAccountL.get(accountHandleL.get());
equal(getter(setter(azusa)), 'yui');