diff --git a/packages/fpdart/lib/src/effect.dart b/packages/fpdart/lib/src/effect.dart index 1ddca83..0ff6293 100644 --- a/packages/fpdart/lib/src/effect.dart +++ b/packages/fpdart/lib/src/effect.dart @@ -203,6 +203,9 @@ final class Effect extends IEffect { (_) => f().then(Right.new), ); + /// {@category constructors} + factory Effect.from(Exit Function(E env) f) => Effect._(f); + /// {@category constructors} factory Effect.fail(L value) => Effect._((_) => Left(Failure(value))); @@ -282,13 +285,14 @@ final class Effect extends IEffect { ) => flatMap((_) => effect); - /// Extract the required dependency from the complete environment. - /// /// {@category do_notation} - Effect provide(E Function(V env) f) => Effect._( + Effect mapEnv(E Function(V env) f) => Effect._( (env) => _unsafeRun(f(env)), ); + /// {@category do_notation} + Effect provide(E env) => Effect._((_) => _unsafeRun(env)); + /// {@category do_notation} static Effect env() => Effect._( (env) => Right(env), @@ -589,11 +593,21 @@ final class Effect extends IEffect { ); } -extension ProvideVoid on Effect { - /// Add a required dependency instead of [void]. - /// +extension ProvideNull on Effect { /// {@category do_notation} Effect withEnv() => Effect._( (env) => _unsafeRun(null), ); + + /// {@category execution} + R runSyncVoid() => runSync(null); + + /// {@category execution} + Future runFutureVoid() => runFuture(null); + + /// {@category execution} + Either, R> runSyncExitVoid() => runSyncExit(null); + + /// {@category execution} + Future, R>> runFutureExitVoid() => runFutureExit(null); } diff --git a/packages/fpdart/test/src/effect/effect_constructors_test.dart b/packages/fpdart/test/src/effect/effect_constructors_test.dart index 8197216..e61d6ba 100644 --- a/packages/fpdart/test/src/effect/effect_constructors_test.dart +++ b/packages/fpdart/test/src/effect/effect_constructors_test.dart @@ -53,7 +53,7 @@ void main() { group('gen', () { test('sync succeed', () { - final main = Effect.gen(($) { + final main = Effect.gen(($) { final value = $.sync(Effect.succeed(10)); return value; }); @@ -62,7 +62,7 @@ void main() { }); test('sync fail', () { - final main = Effect.gen(($) { + final main = Effect.gen(($) { final value = $.sync(Effect.fail("abc")); return value; }); @@ -71,7 +71,7 @@ void main() { }); test('async succeed', () async { - final main = Effect.gen(($) async { + final main = Effect.gen(($) async { final value = await $.async(Effect.functionSucceed(() => Future.value(10))); return value; @@ -81,7 +81,7 @@ void main() { }); test('fail when running async as sync', () async { - final main = Effect.gen(($) { + final main = Effect.gen(($) { final value = $.sync(Effect.functionSucceed( () async => Future.value(10), )); diff --git a/packages/fpdart/test/src/effect/effect_do_notation_test.dart b/packages/fpdart/test/src/effect/effect_do_notation_test.dart new file mode 100644 index 0000000..aa476ee --- /dev/null +++ b/packages/fpdart/test/src/effect/effect_do_notation_test.dart @@ -0,0 +1,36 @@ +import "package:fpdart/fpdart.dart"; +import "package:test/test.dart"; + +void main() { + group( + "Effect do notation", + () { + group('provide', () { + test('remove dependency', () { + final main = Effect.gen(($) { + final env = $.sync(Effect.env()); + return env.length; + }); + + final program = main.provide("abc"); + final result = program.runSyncVoid(); + expect(result, 3); + }); + }); + + group('mapEnv', () { + test('adapt dependency from another program', () { + final subMain = + Effect.from((env) => Right(env + 1)); + final main = Effect.gen(($) { + final value = $.sync(subMain.mapEnv((env) => env.length)); + return value; + }); + + final result = main.runSync("abc"); + expect(result, 4); + }); + }); + }, + ); +}