-
Notifications
You must be signed in to change notification settings - Fork 0
/
rando.js
71 lines (60 loc) · 1.08 KB
/
rando.js
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
const log = require( './lib/log' )
const {
//ADT
Pair,
State,
// Maybe
option,
prop,
// State
State: {
modify,
get,
},
// Helper
assign,
chain,
map,
// Combinator
compose,
constant,
} = require( 'crocks' )
// const rando = () => State( s => {
// const seed = ( 1103515245 * s.seed + 12345 ) & 0x7fffffff
// const value = ( seed >> 16 ) / 0x7fff
// return Pair( value, assign( { seed }, s ) )
// } )
// log(
// rando()
// .chain( rando )
// .chain( rando )
// .runWith( { seed: 23 } )
// )
// Could also be modeled as a Writer, where the Monoid on the right is Last Monoid
const pluckSeed =
def => compose(
option( def ),
prop( 'seed' )
)
const rando = x => {
const seed = ( 1103515245 * x + 12345 ) & 0x7fffffff
const value = ( seed >>> 16 ) / 0x7fff
return compose(
map( constant( value ) ),
modify,
assign
)( { seed } )
}
const pullRandom =
compose(
chain( rando ),
get,
pluckSeed
)
const seed = 73
log(
State.of( seed )
.chain( pullRandom )
.chain( pullRandom )
.runWith( {} )
)