diff --git a/Directory.Packages.props b/Directory.Packages.props index aa6cb94..daa5f11 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,12 +10,10 @@ - - all runtime; build; native; contentfiles; analyzers; buildtransitive - \ No newline at end of file + diff --git a/src/Fraktalio.FModel/InternalDecider.cs b/src/Fraktalio.FModel/InternalDecider.cs index f077a80..313cb83 100644 --- a/src/Fraktalio.FModel/InternalDecider.cs +++ b/src/Fraktalio.FModel/InternalDecider.cs @@ -1,7 +1,5 @@ namespace Fraktalio.FModel; - - /// /// [InternalDecider] is a datatype that represents the main decision-making algorithm. /// It has five generic parameters [C], [Si], [So], [Ei], [Eo] , representing the type of the values that [InternalDecider] may contain or use. @@ -60,7 +58,7 @@ internal InternalDecider(Func> decide, /// /// Cn Command new /// - public InternalDecider MapLeftOnCommand(Func f) + internal InternalDecider MapLeftOnCommand(Func f) { return new InternalDecider( (cn, si) => Decide(f(cn), si), @@ -142,7 +140,7 @@ public InternalDecider MapLeftOnState(Func f) /// /// /// - public InternalDecider MapOnState(Func f) + private InternalDecider MapOnState(Func f) { return DimapOnState(si => si, f); } @@ -153,7 +151,7 @@ public InternalDecider MapOnState(Func f) /// /// /// - public InternalDecider ApplyOnState(InternalDecider, Ei, Eo> ff) + private InternalDecider ApplyOnState(InternalDecider, Ei, Eo> ff) { return new InternalDecider( (c, si) => ff.Decide(c, si).Concat(Decide(c, si)), @@ -168,7 +166,7 @@ public InternalDecider ApplyOnState(InternalDecider /// /// - public InternalDecider, Ei, Eo> ProductOnState(InternalDecider fb) + internal InternalDecider, Ei, Eo> ProductOnState(InternalDecider fb) { return ApplyOnState(fb.MapOnState(b => new Func>(a => new Tuple(a, b)))); } @@ -205,19 +203,19 @@ internal static class InternalDeciderExtensions this InternalDecider x, InternalDecider y) where C : class?, C_SUPER? - where C2 : class?, C_SUPER - where Ei : Ei_SUPER + where C2 : class, C_SUPER + where Ei : class?, Ei_SUPER? where Eo : Eo_SUPER - where Ei2 : Ei_SUPER + where Ei2 : class, Ei_SUPER where Eo2 : Eo_SUPER { - var deciderX = x.MapLeftOnCommand(c => (c as C)!) + var deciderX = x.MapLeftOnCommand(c => c as C) .MapLeftOnState>(pair => pair.Item1) - .DimapOnEvent(ei => (Ei)ei!, eo => eo); + .DimapOnEvent(ei => ei as Ei, eo => eo); - var deciderY = y.MapLeftOnCommand(c => (c as C2)!) + var deciderY = y.MapLeftOnCommand(c => c as C2) .MapLeftOnState>(pair => pair.Item2) - .DimapOnEvent(ei => (Ei2)ei!, eo => eo); + .DimapOnEvent(ei => ei as Ei2, eo => eo); return deciderX.ProductOnState(deciderY); } diff --git a/src/Fraktalio.FModel/SagaExtensions.cs b/src/Fraktalio.FModel/SagaExtensions.cs index d0829cd..95386e9 100644 --- a/src/Fraktalio.FModel/SagaExtensions.cs +++ b/src/Fraktalio.FModel/SagaExtensions.cs @@ -2,6 +2,15 @@ namespace Fraktalio.FModel; public static class SagaExtensions { + /// + /// Saga DSL - A convenient builder DSL for the see cref="Saga{AR,A}"/> + /// + /// + /// + /// + /// + public static Saga ToSaga(this Func> react) => new(react); + /// /// Combines [Saga]s into one [Saga] /// diff --git a/src/Fraktalio.FModel/SagaFactory.cs b/src/Fraktalio.FModel/SagaFactory.cs deleted file mode 100644 index 7a9b94e..0000000 --- a/src/Fraktalio.FModel/SagaFactory.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Fraktalio.FModel; - -public static class SagaFactory -{ - /// - /// Saga DSL - A convenient builder DSL for the see cref="Saga{AR,A}"/> - /// - /// - /// - /// - /// - public static Saga Create(Func> react) - { - return new Saga(react); - } -} diff --git a/test/Fraktalio.FModel.Tests/Examples/NumberSagaFactory.cs b/test/Fraktalio.FModel.Tests/Examples/NumberSagaFactory.cs index 715d082..5fcb6bc 100644 --- a/test/Fraktalio.FModel.Tests/Examples/NumberSagaFactory.cs +++ b/test/Fraktalio.FModel.Tests/Examples/NumberSagaFactory.cs @@ -1,4 +1,3 @@ -using Fraktalio.FModel; using Fraktalio.FModel.Tests.Examples.Numbers; namespace Fraktalio.FModel.Tests.Examples; @@ -11,31 +10,19 @@ namespace Fraktalio.FModel.Tests.Examples; public static class NumberSagaFactory { - public static Saga CreateEvenNumberSaga() - { - var react = EvenNumberSaga; - return SagaFactory.Create(react); - } - - public static Saga CreateOddNumberSaga() - { - var react = OddNumberSaga; - return SagaFactory.Create(react); - } + public static Saga EvenNumberSaga() => EvenNumberSagaReact().ToSaga(); /// - /// Very simple Number saga, just for fun ;) + /// Even number saga /// - /// It reacts on Action Results of type of any Event (Even or Odd) and issue a Command/Action (Odd or Even) - /// For example if the EvenNumberAdded happened with value 4, a new command of type AddOddNumber will be published with value EvenNumberAdded-1=3 + /// It reacts on Action Results of type of any [NumberEvent.EvenNumberEvent] and issue a Command/Action of type [NumberCommand.OddNumberCommand] /// /// The event /// List of commands - private static IEnumerable NumberSaga(NumberEvent numberEvent) - { - return numberEvent switch + private static Func> EvenNumberSagaReact() => + numberEvent => numberEvent switch { - EvenNumberAdded evenNumberAdded => new NumberCommand[] + EvenNumberAdded evenNumberAdded => new OddNumberCommand[] { new OddNumberCommand.AddOddNumber( new Description($"{evenNumberAdded.Value.Value - 1}"), @@ -43,66 +30,18 @@ private static IEnumerable NumberSaga(NumberEvent numberEvent) ) }, - EvenNumberEvent.EvenNumberSubtracted evenNumberSubtracted => new NumberCommand[] - { + EvenNumberEvent.EvenNumberSubtracted evenNumberSubtracted => + [ new OddNumberCommand.SubtractOddNumber( new Description($"{evenNumberSubtracted.Value.Value - 1}"), new Number(evenNumberSubtracted.Value.Value - 1) ) - }, + ], - OddNumberEvent.OddNumberAdded oddNumberAdded => new NumberCommand[] - { - new EvenNumberCommand.AddEvenNumber( - new Description($"{oddNumberAdded.Value.Value + 1}"), - new Number(oddNumberAdded.Value.Value + 1) - ) - }, - - OddNumberEvent.OddNumberSubtracted oddNumberSubtracted => new NumberCommand[] - { - new EvenNumberCommand.SubtractEvenNumber( - new Description($"{oddNumberSubtracted.Value.Value + 1}"), - new Number(oddNumberSubtracted.Value.Value + 1) - ) - }, - - _ => Enumerable.Empty() + _ => [] }; - } - - /// - /// Even number saga - /// - /// It reacts on Action Results of type of any [NumberEvent.EvenNumberEvent] and issue a Command/Action of type [NumberCommand.OddNumberCommand] - /// - /// The event - /// List of commands - private static IEnumerable EvenNumberSaga( - this EvenNumberEvent? numberEvent) - { - return numberEvent switch - { - EvenNumberAdded evenNumberAdded => new OddNumberCommand[] - { - new OddNumberCommand.AddOddNumber( - new Description($"{evenNumberAdded.Value.Value - 1}"), - new Number(evenNumberAdded.Value.Value - 1) - ) - }, - EvenNumberEvent.EvenNumberSubtracted evenNumberSubtracted => new OddNumberCommand - [] - { - new OddNumberCommand.SubtractOddNumber( - new Description($"{evenNumberSubtracted.Value.Value - 1}"), - new Number(evenNumberSubtracted.Value.Value - 1) - ) - }, - - _ => Enumerable.Empty() - }; - } + public static Saga OddNumberSaga() => OddNumberSagaReact().ToSaga(); /// /// Odd number saga @@ -111,10 +50,8 @@ private static IEnumerable EvenNumberSaga( /// /// The event /// List of commands - public static IEnumerable OddNumberSaga( - this OddNumberEvent? numberEvent) - { - return numberEvent switch + private static Func> OddNumberSagaReact() => + numberEvent => numberEvent switch { OddNumberEvent.OddNumberAdded oddNumberAdded => new EvenNumberCommand[] { @@ -124,15 +61,14 @@ public static IEnumerable OddNumberSaga( ) }, - OddNumberEvent.OddNumberSubtracted oddNumberSubtracted => new EvenNumberCommand[] - { + OddNumberEvent.OddNumberSubtracted oddNumberSubtracted => + [ new EvenNumberCommand.SubtractEvenNumber( new Description($"{oddNumberSubtracted.Value.Value - 1}"), new Number(oddNumberSubtracted.Value.Value - 1) ) - }, + ], - _ => Enumerable.Empty() + _ => [] }; - } } diff --git a/test/Fraktalio.FModel.Tests/SagaTest.cs b/test/Fraktalio.FModel.Tests/SagaTest.cs index 061c1dc..914d030 100644 --- a/test/Fraktalio.FModel.Tests/SagaTest.cs +++ b/test/Fraktalio.FModel.Tests/SagaTest.cs @@ -1,11 +1,10 @@ -using Fraktalio.FModel.Tests.Examples; -using Fraktalio.FModel.Tests.Examples.Numbers; - +using Fraktalio.FModel.Tests.Examples.Numbers; using EvenNumberEvent = Fraktalio.FModel.Tests.Examples.Numbers.NumberEvent.EvenNumberEvent; using EvenNumberAdded = Fraktalio.FModel.Tests.Examples.Numbers.NumberEvent.EvenNumberEvent.EvenNumberAdded; using OddNumberEvent = Fraktalio.FModel.Tests.Examples.Numbers.NumberEvent.OddNumberEvent; using OddNumberCommand = Fraktalio.FModel.Tests.Examples.Numbers.NumberCommand.OddNumberCommand; using EvenNumberCommand = Fraktalio.FModel.Tests.Examples.Numbers.NumberCommand.EvenNumberCommand; +using static Fraktalio.FModel.Tests.Examples.NumberSagaFactory; namespace Fraktalio.FModel.Tests; @@ -18,8 +17,8 @@ public class SagaTest [SetUp] public void Setup() { - _evenSaga = NumberSagaFactory.CreateEvenNumberSaga(); - _oddSaga = NumberSagaFactory.CreateOddNumberSaga(); + _evenSaga = EvenNumberSaga(); + _oddSaga = OddNumberSaga(); } [Test]