Skip to content

Commit 73185d7

Browse files
committed
Add natural_number.modulo to prelude
Also the `%` alias.
1 parent 0b00652 commit 73185d7

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

src/end-to-end.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ testCases(endToEnd, code => code)('end-to-end tests', [
339339
4`,
340340
either.makeRight('10'),
341341
],
342-
[`{ f: _ => 1 + 1 }.f(whatever)`, either.makeRight('2')],
342+
[`{ f: _ => 5 % 3 }.f(whatever)`, either.makeRight('2')],
343343
[
344344
`{
345345
one: 1

src/language/semantics/prelude.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ export const prelude = makeObjectNode({
2121
'-': integer.subtract,
2222
'<': integer.less_than,
2323
'>': integer.greater_than,
24+
'%': natural_number.modulo,
2425
})

src/language/semantics/stdlib/natural-number.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,44 @@ export const natural_number = {
7575
: 'false',
7676
),
7777
),
78+
modulo: preludeFunction(
79+
['natural_number', 'modulo'],
80+
{
81+
parameter: types.naturalNumber,
82+
return: makeFunctionType('', {
83+
parameter: types.naturalNumber,
84+
return: types.naturalNumber,
85+
}),
86+
},
87+
number2 =>
88+
either.makeRight(
89+
makeFunctionNode(
90+
{
91+
parameter: types.naturalNumber,
92+
return: types.naturalNumber,
93+
},
94+
serializeOnceAppliedFunction(['natural_number', 'modulo'], number2),
95+
option.none,
96+
number1 => {
97+
if (
98+
typeof number1 !== 'string' ||
99+
!types.naturalNumber.isAssignableFrom(
100+
makeUnionType('', [number1]),
101+
) ||
102+
typeof number2 !== 'string' ||
103+
!types.naturalNumber.isAssignableFrom(
104+
makeUnionType('', [number2]),
105+
)
106+
) {
107+
return either.makeLeft({
108+
kind: 'panic',
109+
message: 'numbers must be atoms',
110+
})
111+
} else {
112+
return either.makeRight(String(BigInt(number1) % BigInt(number2)))
113+
}
114+
},
115+
),
116+
),
117+
),
78118
}

0 commit comments

Comments
 (0)