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;
}
}
+// 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) {