Skip to content

Commit 0dfbd37

Browse files
committed
Add integer.add to prelude
1 parent 172012b commit 0dfbd37

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

src/end-to-end.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,5 @@ testCases(endToEnd, code => code)('end-to-end tests', [
198198
assert(either.isLeft(output))
199199
},
200200
],
201+
[`:integer.add(42)(-1)`, either.makeRight('41')],
201202
])

src/language/compiling/semantics/prelude.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,58 @@ export const prelude: ObjectNode = makeObjectNode({
185185
},
186186
),
187187

188+
integer: makeObjectNode({
189+
add: preludeFunction(
190+
['integer', 'add'],
191+
{
192+
parameter: types.integer,
193+
return: makeFunctionType('', {
194+
parameter: types.integer,
195+
return: types.integer,
196+
}),
197+
},
198+
number2 =>
199+
either.makeRight(
200+
makeFunctionNode(
201+
{
202+
parameter: types.integer,
203+
return: types.integer,
204+
},
205+
() =>
206+
either.makeRight(
207+
makeUnelaboratedObjectNode({
208+
0: '@apply',
209+
function: {
210+
0: '@lookup',
211+
query: { 0: 'integer', 1: 'add' },
212+
},
213+
argument: number2,
214+
}),
215+
),
216+
option.none,
217+
number1 => {
218+
if (
219+
typeof number1 !== 'string' ||
220+
!types.integer.isAssignableFrom(makeUnionType('', [number1])) ||
221+
typeof number2 !== 'string' ||
222+
!types.integer.isAssignableFrom(makeUnionType('', [number2]))
223+
) {
224+
return either.makeLeft({
225+
kind: 'panic',
226+
message: 'numbers must be atoms',
227+
})
228+
} else {
229+
return either.makeRight(
230+
// TODO: See comment in `natural_number.add`.
231+
String(BigInt(number1) + BigInt(number2)),
232+
)
233+
}
234+
},
235+
),
236+
),
237+
),
238+
}),
239+
188240
identity: preludeFunction(
189241
['identity'],
190242
{ parameter: A, return: A },
@@ -290,7 +342,7 @@ export const prelude: ObjectNode = makeObjectNode({
290342
return: types.naturalNumber,
291343
}),
292344
},
293-
number1 =>
345+
number2 =>
294346
either.makeRight(
295347
makeFunctionNode(
296348
{
@@ -305,11 +357,11 @@ export const prelude: ObjectNode = makeObjectNode({
305357
0: '@lookup',
306358
query: { 0: 'natural_number', 1: 'add' },
307359
},
308-
argument: number1,
360+
argument: number2,
309361
}),
310362
),
311363
option.none,
312-
number2 => {
364+
number1 => {
313365
if (
314366
typeof number1 !== 'string' ||
315367
!types.naturalNumber.isAssignableFrom(

0 commit comments

Comments
 (0)