From 03ac342c54dced610f4b8a015db5d4c99be5e85f Mon Sep 17 00:00:00 2001 From: Paul Louth Date: Thu, 19 Dec 2024 01:17:34 +0000 Subject: [PATCH] Solve map recursion issue --- LanguageExt.Core/Effects/IO/DSL/IOMap.cs | 40 ++++++++++++++++++++-- LanguageExt.Core/Effects/IO/Free/IOBind.cs | 8 ++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/LanguageExt.Core/Effects/IO/DSL/IOMap.cs b/LanguageExt.Core/Effects/IO/DSL/IOMap.cs index 6758df879..901988d06 100644 --- a/LanguageExt.Core/Effects/IO/DSL/IOMap.cs +++ b/LanguageExt.Core/Effects/IO/DSL/IOMap.cs @@ -16,17 +16,53 @@ abstract record IOMapAsync : IODsl record IOMap(A Value, Func F) : IOMap { public override IODsl Map(Func g) => - new IOMap(Value, x => g(F(x))); + new IOMap(Value, F, g); public override B Invoke(EnvIO envIO) => F(Value); } +record IOMap(A Value, Func F, Func G) : IOMap +{ + public override IODsl Map(Func h) => + new IOMap(Value, F, G, h); + + public override C Invoke(EnvIO envIO) => + G(F(Value)); +} + +record IOMap(A Value, Func F, Func G, Func H) : IOMap +{ + public override IODsl Map(Func f) => + new IOMap(Value, F, G, x => f(H(x))); + + public override D Invoke(EnvIO envIO) => + H(G(F(Value))); +} + record IOMapAsync(Task Value, Func F) : IOMapAsync { public override IODsl Map(Func g) => - new IOMapAsync(Value, x => g(F(x))); + new IOMapAsync(Value, F, g); public override async ValueTask Invoke(EnvIO envIO) => F(await Value); } + +record IOMapAsync(Task Value, Func F, Func G) : IOMapAsync +{ + public override IODsl Map(Func h) => + new IOMapAsync(Value, F, G, h); + + public override async ValueTask Invoke(EnvIO envIO) => + G(F(await Value)); +} + +record IOMapAsync(Task Value, Func F, Func G, Func H) : IOMapAsync +{ + public override IODsl Map(Func f) => + new IOMapAsync(Value, F, G, x => f(H(x))); + + public override async ValueTask Invoke(EnvIO envIO) => + H(G(F(await Value))); +} diff --git a/LanguageExt.Core/Effects/IO/Free/IOBind.cs b/LanguageExt.Core/Effects/IO/Free/IOBind.cs index 0b4ec1b5e..c7bd68c32 100644 --- a/LanguageExt.Core/Effects/IO/Free/IOBind.cs +++ b/LanguageExt.Core/Effects/IO/Free/IOBind.cs @@ -18,10 +18,10 @@ abstract record IOBindAsync : IO record IOBind(A Value, Func> F) : IOBind { public override IO Map(Func f) => - new IOBind(Value, x => F(x).Map(f)); + new IOBind(Value, x => F(x).As().Map(f)); public override IO Bind(Func> f) => - new IOBind(Value, x => F(x).Bind(f)); + new IOBind(Value, x => F(x).As().Bind(f)); public override IO Invoke(EnvIO envIO) => F(Value).As(); @@ -30,10 +30,10 @@ public override IO Invoke(EnvIO envIO) => record IOBindAsync(Task Value, Func> F) : IOBindAsync { public override IO Map(Func f) => - new IOBindAsync(Value, x => F(x).Map(f)); + new IOBindAsync(Value, x => F(x).As().Map(f)); public override IO Bind(Func> f) => - new IOBindAsync(Value, x => F(x).Bind(f)); + new IOBindAsync(Value, x => F(x).As().Bind(f)); public override async ValueTask> Invoke(EnvIO envIO) => F(await Value).As();