aboutsummaryrefslogtreecommitdiff
path: root/std/prelude/convert.pk
diff options
context:
space:
mode:
Diffstat (limited to 'std/prelude/convert.pk')
-rw-r--r--std/prelude/convert.pk23
1 files changed, 23 insertions, 0 deletions
diff --git a/std/prelude/convert.pk b/std/prelude/convert.pk
new file mode 100644
index 0000000..6abf543
--- /dev/null
+++ b/std/prelude/convert.pk
@@ -0,0 +1,23 @@
+## std.convert: Interfaces for type coersion and conversion.
+## This module is imported by default.
+
+## The Coerce interface is used for type conversion that will not fail.
+## Its associated methods, `from` and `into`, are used internally
+## by the compiler for implicit type conversion (coersion).
+pub type Coerce[T] = interface
+ from(T): Self
+ # into(Self): T
+
+## The `into` function is automatically implemented for all types that
+## implement `from`: that is, all types U that are convertable to T.
+pub func into[T, U: Coerce[T]](self: T): U =
+ from(self)
+
+## The Convert interface is used for type conversion that may fail.
+# We'll see what this breaks.
+pub type Convert[T] = interface
+ from(T): Self?!
+
+## A blanket implementation of a corresponding `into` function.
+pub func into[T, U: Convert[T]](self: T): U =
+ from(self)