From 4a94a3dab463857fb1e881d4ab835ef5351ba9ac Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 21 Jun 2017 19:08:27 -0400 Subject: - Added Task type, as a promise that can fail. --- stdlib/source/lux/concurrency/task.lux | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 stdlib/source/lux/concurrency/task.lux diff --git a/stdlib/source/lux/concurrency/task.lux b/stdlib/source/lux/concurrency/task.lux new file mode 100644 index 000000000..239572bff --- /dev/null +++ b/stdlib/source/lux/concurrency/task.lux @@ -0,0 +1,51 @@ +(;module: + lux + (lux (data ["R" result]) + (control functor + applicative + monad) + (concurrency ["P" promise]) + )) + +(type: #export (Task a) + (P;Promise (R;Result a))) + +(struct: #export _ (Functor Task) + (def: (map f fa) + (:: P;Functor map + (function [fa'] + (case fa' + (#R;Error error) + (#R;Error error) + + (#R;Success a) + (#R;Success (f a)))) + fa))) + +(struct: #export _ (Applicative Task) + (def: functor Functor) + + (def: (wrap a) + (:: P;Applicative wrap (#R;Success a))) + + (def: (apply ff fa) + (do P;Monad + [ff' ff + fa' fa] + (wrap (do R;Monad + [f ff' + a fa'] + (wrap (f a))))))) + +(struct: #export _ (Monad Task) + (def: applicative Applicative) + + (def: (join mma) + (do P;Monad + [mma' mma] + (case mma' + (#R;Error error) + (wrap (#R;Error error)) + + (#R;Success ma) + ma)))) -- cgit v1.2.3