Skip to content

Commit 7ff99e6

Browse files
committed
Add integer.less_than to prelude
1 parent 50dcc31 commit 7ff99e6

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

src/end-to-end.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,15 @@ testCases(endToEnd, code => code)('end-to-end tests', [
201201
[`:integer.add(42)(-1)`, either.makeRight('41')],
202202
[`:integer.subtract(-1)(-1)`, either.makeRight('0')],
203203
[`:integer.subtract(1)(2)`, either.makeRight('1')],
204+
[
205+
`:object.lookup(output)({
206+
add_one: :integer.add(1)
207+
less_than_three: :integer.less_than(3)
208+
output: :less_than_three(:add_one(1))
209+
})`,
210+
either.makeRight({
211+
tag: 'some',
212+
value: 'true',
213+
}),
214+
],
204215
])

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+
less_than: preludeFunction(
239+
['integer', 'less_than'],
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.boolean,
253+
},
254+
() =>
255+
either.makeRight(
256+
makeUnelaboratedObjectNode({
257+
0: '@apply',
258+
function: {
259+
0: '@lookup',
260+
query: { 0: 'integer', 1: 'less_than' },
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
subtract: preludeFunction(
239288
['integer', 'subtract'],
240289
{

0 commit comments

Comments
 (0)