aboutsummaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-11-02 22:34:35 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-11-02 22:34:35 -0400
commit92a593b80fe935eb21615dc45b4d7868b254bec6 (patch)
tree029e43ff46abc4bd86000c5a90900511ea99fcf3 /types.c
parent0b7a0dd043a4c7ccfc924d618508d1edc0115e2f (diff)
Support reductions for comparison operators like == and <
Diffstat (limited to 'types.c')
-rw-r--r--types.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/types.c b/types.c
index bcb0e9f3..ddb3f076 100644
--- a/types.c
+++ b/types.c
@@ -626,4 +626,24 @@ type_t *get_field_type(type_t *t, const char *field_name)
}
}
+PUREFUNC type_t *get_iterated_type(type_t *t)
+{
+ type_t *iter_value_t = value_type(t);
+ switch (iter_value_t->tag) {
+ case BigIntType: case IntType: return iter_value_t; break;
+ case ArrayType: return Match(iter_value_t, ArrayType)->item_type; break;
+ case SetType: return Match(iter_value_t, SetType)->item_type; break;
+ case TableType: return NULL;
+ case FunctionType: case ClosureType: {
+ // Iterator function
+ auto fn = iter_value_t->tag == ClosureType ?
+ Match(Match(iter_value_t, ClosureType)->fn, FunctionType) : Match(iter_value_t, FunctionType);
+ if (fn->args || fn->ret->tag != OptionalType)
+ return NULL;
+ return Match(fn->ret, OptionalType)->type;
+ }
+ default: return NULL;
+ }
+}
+
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0