From 2e95cdb437422de686889bca0c4bf4cf69f53935 Mon Sep 17 00:00:00 2001 From: Ian McIntosh Date: Mon, 6 Jun 2022 16:51:04 -0400 Subject: [PATCH] Add Task.fromEither --- lib/src/task.dart | 2 ++ test/task_test.dart | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/src/task.dart b/lib/src/task.dart index fbae897..efb2f42 100644 --- a/lib/src/task.dart +++ b/lib/src/task.dart @@ -11,6 +11,8 @@ class Task implements MonadCatchOps { static Task failed(Object err) => new Task(() => new Future.error(err)); + static Task fromEither(Either e) => e.fold((l) => Task.failed(l), (r) => Task.value(r)); + static Task sleep(Duration duration) => Task(() => Future.delayed(duration)); static Task print(String s) => Task.delay(() => _consolePrint(s)); diff --git a/test/task_test.dart b/test/task_test.dart index cf2eba1..a0025b1 100644 --- a/test/task_test.dart +++ b/test/task_test.dart @@ -16,6 +16,21 @@ void main() { expect(result1, result2); }); + test('Task.fromEither', () async { + final taskLeft = await Task.value(1000) + .productR(Task.fromEither(left('boom'))) + .attempt() + .run(); + + final taskRight = await Task.fromEither(right(42)) + .replace(1000) + .attempt() + .run(); + + expect(taskLeft, left('boom')); + expect(taskRight, right(1000)); + }); + test("Task attempt", () async { final Task> t = Task.delay(() => "notanumber").map(num.parse).attempt();