aboutsummaryrefslogtreecommitdiff
path: root/source/lux/codata/lazy.lux
diff options
context:
space:
mode:
Diffstat (limited to 'source/lux/codata/lazy.lux')
-rw-r--r--source/lux/codata/lazy.lux48
1 files changed, 48 insertions, 0 deletions
diff --git a/source/lux/codata/lazy.lux b/source/lux/codata/lazy.lux
new file mode 100644
index 000000000..94968de20
--- /dev/null
+++ b/source/lux/codata/lazy.lux
@@ -0,0 +1,48 @@
+## Copyright (c) Eduardo Julian. All rights reserved.
+## The use and distribution terms for this software are covered by the
+## Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+## which can be found in the file epl-v10.html at the root of this distribution.
+## By using this software in any fashion, you are agreeing to be bound by
+## the terms of this license.
+## You must not remove this notice, or any other, from this software.
+
+(;import lux
+ (lux (meta macro)
+ (control (functor #as F #refer #all)
+ (monad #as M #refer #all))
+ (data list))
+ (.. function))
+
+## Types
+(deftype #export (Lazy a)
+ (All [b]
+ (-> (-> a b) b)))
+
+## Syntax
+(defmacro #export (... tokens state)
+ (case tokens
+ (\ (list value))
+ (let [blank (symbol$ ["" ""])]
+ (#;Right [state (list (` (;lambda [(~ blank)] ((~ blank) (~ value)))))]))
+
+ _
+ (#;Left "Wrong syntax for ...")))
+
+## Functions
+(def #export (! thunk)
+ (All [a]
+ (-> (Lazy a) a))
+ (thunk id))
+
+## Structs
+(defstruct #export Lazy/Functor (Functor Lazy)
+ (def (F;map f ma)
+ (lambda [k] (ma (. k f)))))
+
+(defstruct #export Lazy/Monad (Monad Lazy)
+ (def M;_functor Lazy/Functor)
+
+ (def (M;wrap a)
+ (... a))
+
+ (def M;join !))