Skip to content

Commit 50dcc31

Browse files
committed
Add integer.subtract to prelude
1 parent 0dfbd37 commit 50dcc31

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/end-to-end.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,6 @@ testCases(endToEnd, code => code)('end-to-end tests', [
199199
},
200200
],
201201
[`:integer.add(42)(-1)`, either.makeRight('41')],
202+
[`:integer.subtract(-1)(-1)`, either.makeRight('0')],
203+
[`:integer.subtract(1)(2)`, either.makeRight('1')],
202204
])

src/language/compiling/semantics/prelude.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,55 @@ export const prelude: ObjectNode = makeObjectNode({
235235
),
236236
),
237237
),
238+
subtract: preludeFunction(
239+
['integer', 'subtract'],
240+
{
241+
parameter: types.integer,
242+
return: makeFunctionType('', {
243+
parameter: types.integer,
244+
return: types.integer,
245+
}),
246+
},
247+
number2 =>
248+
either.makeRight(
249+
makeFunctionNode(
250+
{
251+
parameter: types.integer,
252+
return: types.integer,
253+
},
254+
() =>
255+
either.makeRight(
256+
makeUnelaboratedObjectNode({
257+
0: '@apply',
258+
function: {
259+
0: '@lookup',
260+
query: { 0: 'integer', 1: 'subtract' },
261+
},
262+
argument: number2,
263+
}),
264+
),
265+
option.none,
266+
number1 => {
267+
if (
268+
typeof number1 !== 'string' ||
269+
!types.integer.isAssignableFrom(makeUnionType('', [number1])) ||
270+
typeof number2 !== 'string' ||
271+
!types.integer.isAssignableFrom(makeUnionType('', [number2]))
272+
) {
273+
return either.makeLeft({
274+
kind: 'panic',
275+
message: 'numbers must be atoms',
276+
})
277+
} else {
278+
return either.makeRight(
279+
// TODO: See comment in `natural_number.add`.
280+
String(BigInt(number1) - BigInt(number2)),
281+
)
282+
}
283+
},
284+
),
285+
),
286+
),
238287
}),
239288

240289
identity: preludeFunction(

0 commit comments

Comments
 (0)