bugfix; added ImplicitIterator
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 21 Oct 2022 12:50:51 +0000 (07:50 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 21 Oct 2022 12:50:51 +0000 (07:50 -0500)
compiler/src/astnodes.c
core/container/iter.onyx

index 54837f9d908c9007d4e6be67ac6550f637e7c8bf..70601550990829b8fbc643b2c25d511613e9705e 100644 (file)
@@ -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;
index 5e34063aedc25722312a3e800979231d32215ac3..8d8a7aa8d9df23168b46bd1f383b5d774c46cd48 100644 (file)
@@ -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) {