forked from gcanti/fp-ts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSemigroup.ts
81 lines (71 loc) · 2.21 KB
/
Semigroup.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
81
import * as assert from 'assert'
import { monoidString } from '../src/Monoid'
import { ordNumber } from '../src/Ord'
import {
fold,
getFirstSemigroup,
getJoinSemigroup,
getMeetSemigroup,
getObjectSemigroup,
getTupleSemigroup,
semigroupAll,
semigroupProduct,
semigroupString,
semigroupSum,
semigroupVoid,
getDualSemigroup,
getIntercalateSemigroup
} from '../src/Semigroup'
describe('Semigroup', () => {
it('getTupleSemigroup', () => {
const S1 = getTupleSemigroup(semigroupString, semigroupSum)
assert.deepStrictEqual(S1.concat(['a', 1], ['b', 2]), ['ab', 3])
const S2 = getTupleSemigroup(semigroupString, semigroupSum, semigroupAll)
assert.deepStrictEqual(S2.concat(['a', 1, true], ['b', 2, false]), ['ab', 3, false])
})
it('fold', () => {
assert.deepStrictEqual(fold(monoidString)('', ['a', 'b', 'c']), 'abc')
})
it('getMeetSemigroup', () => {
assert.deepStrictEqual(getMeetSemigroup(ordNumber).concat(1, 2), 1)
})
it('getJoinSemigroup', () => {
assert.deepStrictEqual(getJoinSemigroup(ordNumber).concat(1, 2), 2)
})
it('getObjectSemigroup', () => {
type T = {
readonly foo?: number
readonly bar: string
}
const foo: T = {
foo: 123,
bar: '456'
}
const bar: T = {
bar: '123'
}
const S = getObjectSemigroup<T>()
const result = S.concat(foo, bar)
const expected = Object.assign({}, foo, bar)
assert.deepStrictEqual(result.foo, expected.foo)
assert.deepStrictEqual(result.bar, expected.bar)
})
it('semigroupProduct', () => {
assert.deepStrictEqual(semigroupProduct.concat(2, 3), 6)
})
it('getFirstSemigroup', () => {
assert.deepStrictEqual(getFirstSemigroup<number>().concat(1, 2), 1)
})
it('semigroupVoid', () => {
assert.deepStrictEqual(semigroupVoid.concat(undefined, undefined), undefined)
})
it('getDualSemigroup', () => {
const S = getDualSemigroup(semigroupString)
assert.deepStrictEqual(S.concat('a', 'b'), 'ba')
})
it('getIntercalateSemigroup', () => {
const S = getIntercalateSemigroup(' ')(semigroupString)
assert.strictEqual(S.concat('a', 'b'), 'a b')
assert.strictEqual(S.concat(S.concat('a', 'b'), 'c'), S.concat('a', S.concat('b', 'c')))
})
})