From: Brendan Hansen Date: Fri, 21 Oct 2022 12:50:51 +0000 (-0500) Subject: bugfix; added ImplicitIterator X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=51d5aae5ada6f411c3ff5777c6b581e2780e9a6b;p=onyx.git bugfix; added ImplicitIterator --- diff --git a/compiler/src/astnodes.c b/compiler/src/astnodes.c index 54837f9d..70601550 100644 --- a/compiler/src/astnodes.c +++ b/compiler/src/astnodes.c @@ -638,8 +638,12 @@ TypeMatch unify_node_and_type_(AstTyped** pnode, Type* type, b32 permanent) { node->token->text, node->token->length, type_get_name(type), closest); - return TYPE_MATCH_FAILED; + } else { + onyx_report_error(node->token->pos, Error_Critical, "'%b' does not exist in '%s'.", + node->token->text, node->token->length, type_get_name(type)); } + + return TYPE_MATCH_FAILED; } return TYPE_MATCH_YIELD; diff --git a/core/container/iter.onyx b/core/container/iter.onyx index 5e34063a..8d8a7aa8 100644 --- a/core/container/iter.onyx +++ b/core/container/iter.onyx @@ -14,6 +14,40 @@ close :: (it: Iterator($T)) { } } +// Implicit iterator + +#local +ImplicitIterator :: interface (t: $T) { + { t->iter_open() } -> void; + t->iter_next(); + { t->iter_close() } -> void; + + { + do { + value, success := t->iter_next(); + return success; + } + } -> bool; +} + +#overload #precedence 10000 +as_iterator :: (x: $T/ImplicitIterator) => { + extract_iterator_type :: macro (x: $T, next: (T) -> ($I, bool)) -> Iterator(I) { + x->iter_open(); + + return .{ + data = x, + next = next, + close = x.iter_close + }; + } + + return extract_iterator_type(x, T.iter_next); +} + + +// Iterator Modifiers + filter :: #match #local {} #overload filter :: (it: Iterator($T), predicate: (T) -> bool, allocator := context.temp_allocator) -> Iterator(T) {