-
Notifications
You must be signed in to change notification settings - Fork 482
Expand file tree
/
Copy pathStdlib_Int.res
More file actions
136 lines (108 loc) · 3.69 KB
/
Stdlib_Int.res
File metadata and controls
136 lines (108 loc) · 3.69 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
type t = int
module Constants = {
@inline let minValue = -2147483648
@inline let maxValue = 2147483647
}
external equal: (int, int) => bool = "%equal"
external compare: (int, int) => Stdlib_Ordering.t = "%compare"
@send external toExponential: (int, ~digits: int=?) => string = "toExponential"
@deprecated({
reason: "Use `toExponential` instead",
migrate: Int.toExponential(),
})
@send
external toExponentialWithPrecision: (int, ~digits: int) => string = "toExponential"
@send external toFixed: (int, ~digits: int=?) => string = "toFixed"
@deprecated({
reason: "Use `toFixed` instead",
migrate: Int.toFixed(),
})
@send
external toFixedWithPrecision: (int, ~digits: int) => string = "toFixed"
@send external toPrecision: (int, ~digits: int=?) => string = "toPrecision"
@deprecated({
reason: "Use `toPrecision` instead",
migrate: Int.toPrecision(),
})
@send
external toPrecisionWithPrecision: (int, ~digits: int) => string = "toPrecision"
@send external toString: (int, ~radix: int=?) => string = "toString"
@deprecated({
reason: "Use `toString` instead",
migrate: Int.toString(),
})
@send
external toStringWithRadix: (int, ~radix: int) => string = "toString"
@send external toLocaleString: int => string = "toLocaleString"
external toFloat: int => float = "%identity"
external fromFloat: float => int = "%intoffloat"
let fromString: string => option<int> = str => {
let? Some(num) = str->Stdlib_Float.fromString
num === num->fromFloat->toFloat && Stdlib_Float.isFinite(num) ? Some(num->fromFloat) : None
}
external mod: (int, int) => int = "%modint"
type rangeOptions = {step?: int, inclusive?: bool}
let abs = x =>
if x >= 0 {
x
} else {
-x
}
@val external ceil: float => float = "Math.ceil"
let range = (start, end, ~options: rangeOptions={}) => {
let isInverted = start > end
let step = switch options.step {
| None => isInverted ? -1 : 1
| Some(0) if start !== end =>
Stdlib_Error.throw(Stdlib_Error.RangeError.make("Incorrect range arguments"))
| Some(n) => n
}
let length = if isInverted === (step >= 0) {
0 // infinite because step goes in opposite direction of end
} else if step == 0 {
options.inclusive === Some(true) ? 1 : 0
} else {
let range = isInverted ? start - end : end - start
let range = options.inclusive === Some(true) ? range + 1 : range
ceil(Stdlib_Float.fromInt(range) /. Stdlib_Float.fromInt(abs(step)))->Stdlib_Float.toInt
}
Stdlib_Array.fromInitializer(~length, i => start + i * step)
}
@deprecated({
reason: "Use `range` instead",
migrate: Int.range(~options=%insert.unlabelledArgument(2)),
})
@send
let rangeWithOptions = (start, end, options) => range(start, end, ~options)
let clamp = (~min=?, ~max=?, value): int => {
let value = switch max {
| Some(max) if max < value => max
| _ => value
}
switch min {
| Some(min) if min > value => min
| _ => value
}
}
external bitwiseAnd: (int, int) => int = "%andint"
external bitwiseOr: (int, int) => int = "%orint"
external bitwiseXor: (int, int) => int = "%xorint"
external bitwiseNot: int => int = "%bitnot_int"
external shiftLeft: (int, int) => int = "%lslint"
external shiftRight: (int, int) => int = "%asrint"
external shiftRightUnsigned: (int, int) => int = "%lsrint"
module Bitwise = {
external land: (int, int) => int = "%andint"
external lor: (int, int) => int = "%orint"
external lxor: (int, int) => int = "%xorint"
external lsl: (int, int) => int = "%lslint"
external lsr: (int, int) => int = "%lsrint"
external asr: (int, int) => int = "%asrint"
let lnot = x => lxor(x, -1)
}
external ignore: int => unit = "%ignore"
module Ref = {
type t = ref<int>
external increment: ref<int> => unit = "%incr"
external decrement: ref<int> => unit = "%decr"
}