aboutsummaryrefslogtreecommitdiff
path: root/src/typecheck.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-04-06 14:52:59 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-04-06 14:52:59 -0400
commit4043a99e0df9fab6791c485721c0046971754175 (patch)
tree5e9c966ecf315be98bd292d6d39511d6c0447ee5 /src/typecheck.c
parent2bb2ff871fa1761478442bec5f6a32c9428360a1 (diff)
Expand reducers so they support stuff like `(+.abs(): nums)` and
`(==.length: texts)`
Diffstat (limited to 'src/typecheck.c')
-rw-r--r--src/typecheck.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/typecheck.c b/src/typecheck.c
index 21e02460..1aec4f3b 100644
--- a/src/typecheck.c
+++ b/src/typecheck.c
@@ -1295,6 +1295,11 @@ type_t *get_type(env_t *env, ast_t *ast)
type_t *iterated = get_iterated_type(iter_t);
if (!iterated)
code_err(reduction->iter, "I don't know how to do a reduction over ", type_to_str(iter_t), " values");
+ if (reduction->key && !(reduction->op == Min || reduction->op == Max)) {
+ env_t *item_scope = fresh_scope(env);
+ set_binding(item_scope, "$", iterated, CORD_EMPTY);
+ iterated = get_type(item_scope, reduction->key);
+ }
return iterated->tag == OptionalType ? iterated : Type(OptionalType, .type=iterated);
}