diff --git a/Sanchime.Functional/Monads/FreeMonad.cs b/Sanchime.Functional/Monads/FreeMonad.cs index 6721cd0..0e10705 100644 --- a/Sanchime.Functional/Monads/FreeMonad.cs +++ b/Sanchime.Functional/Monads/FreeMonad.cs @@ -72,4 +72,17 @@ public static class FreeMonad internal static Free More(Coyo> value) => new More(value); + + #region Linq + + public static Free Select(this Free @this, Func mapping) + => @this.Match(val => Done(mapping(val)), op => More(op.Map(free => free.Select(mapping)))); + + public static Free SelectMany(this Free @this, Func> binding) + => @this.Match(binding, op => More(op.Map(free => free.SelectMany(binding)))); + + public static Free SelectMany(this Free @this, Func> binding, Func project) + => @this.SelectMany(val => Select(binding(val), res => project(val, res))); + + #endregion }