diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-11-02 22:34:35 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-11-02 22:34:35 -0400 |
| commit | 92a593b80fe935eb21615dc45b4d7868b254bec6 (patch) | |
| tree | 029e43ff46abc4bd86000c5a90900511ea99fcf3 /types.c | |
| parent | 0b7a0dd043a4c7ccfc924d618508d1edc0115e2f (diff) | |
Support reductions for comparison operators like == and <
Diffstat (limited to 'types.c')
| -rw-r--r-- | types.c | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -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 |
