-
Notifications
You must be signed in to change notification settings - Fork 1
/
value.ts
54 lines (47 loc) · 1 KB
/
value.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
type ArrayOneOrMore<T> = {
0: T
} & Array<T>
export type Value =
| {
type: 'rand'
value: [Value, Value]
}
| {
type: 'pick'
value: ArrayOneOrMore<Value>
}
| {
type: 'seq'
value: ArrayOneOrMore<Value>
}
| number
export const value = (v: Value, index: number): number => {
if (typeof v === 'number') {
return v
}
if (v.type === 'rand') {
return value(v.value[0], index) +
Math.random() * (value(v.value[1], index) - value(v.value[0], index))
} else if (v.type === 'seq') {
return value(v.value[index % v.value.length], index)
}
return value(v.value[Math.floor(Math.random() * v.value.length)], index)
}
export const seq = (values: ArrayOneOrMore<Value>): Value => {
return {
type: 'seq',
value: values,
}
}
export const pick = (values: ArrayOneOrMore<Value>): Value => {
return {
type: 'pick',
value: values,
}
}
export const rand = (from: Value, to: Value): Value => {
return {
type: 'rand',
value: [from, to],
}
}