Skip to content

Commit

Permalink
Feature/evented fns (#70)
Browse files Browse the repository at this point in the history
* Evented addEvent

* exec mapE listen

Co-authored-by: Radu Popovici <[email protected]>
  • Loading branch information
oncicaradupopovici and Radu Popovici committed Mar 18, 2020
1 parent 1b51653 commit ea83219
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 3 deletions.
10 changes: 9 additions & 1 deletion src/Core/NBB.Core.Evented.FSharp/Evented.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

type Evented<'a, 'e> = Evented of payload:'a * events:'e list

[<RequireQualifiedAccess>]
module Evented =
let map func (Evented(value, events)) = Evented(func value, events)

Expand All @@ -17,6 +18,10 @@ module Evented =

let lift2 f = map f >> apply

let run (Evented(value, events): Evented<'a, 'e>) = (value, events)
let exec (Evented(_value, events): Evented<'a, 'e>) = events
let mapE (func:'e->'f) (Evented(value, events): Evented<'a,'e>) = Evented(value, events |> List.map func)

type Evented<'a, 'e> with
static member Map (x, f) = Evented.map f x
static member Return (x) = Evented.return' x
Expand All @@ -32,14 +37,17 @@ module EventedBuilder =
member _.Zero() = Evented.return' ()

[<AutoOpen>]
module Events =
module EventedExtensions =
let evented = new EventedBuilder.EventedBuilder()

let (<!>) = Evented.map
let (<*>) = Evented.apply
let (>>=) evented func = Evented.bind func evented
let (>=>) = Evented.composeK

let addEvent (ev:'e) = Evented((),[ev])
let listen (Evented (value, events): Evented<'a,'e>) = Evented((value,events),events)

[<RequireQualifiedAccess>]
module List =
let traverseEvented f list =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

<ItemGroup>
<Compile Include="Sample.fs" />
<Compile Include="Sample2.fs" />
<Compile Include="Tests.fs" />
<Compile Include="Program.fs" />
</ItemGroup>
Expand Down
3 changes: 1 addition & 2 deletions test/UnitTests/Core/NBB.Core.Evented.FSharp.Tests/Sample.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module Sample
namespace NBB.Core.Evented.FSharp.Tests

open NBB.Core.Evented.FSharp
open FSharpPlus
Expand All @@ -10,7 +10,6 @@ module Domain =
| Updated

let create x = Evented(AggRoot x, [Added])

let update (x:AggRoot) = Evented(x, [Updated])
let increment (AggRoot x) = AggRoot (x + 1)

Expand Down
31 changes: 31 additions & 0 deletions test/UnitTests/Core/NBB.Core.Evented.FSharp.Tests/Sample2.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace NBB.Core.Evented.FSharp.Tests

open NBB.Core.Evented.FSharp

module Sample2 =
type Payment = {
Id: int
Amount: decimal
Cancelled: bool
}

type DomainEvent =
| Added of Id:int * Amount:decimal
| Cancelled of Id:int

let create (id,amount) =
evented{
let payment = {Id=id; Amount=amount; Cancelled=false}
do! addEvent <| Added(id,amount)
return payment
}

let cancell payment =
evented{
let payment' = {payment with Cancelled=true}
do! addEvent <| Cancelled payment.Id
return payment'
}

let createCancelled = create >=> cancell

0 comments on commit ea83219

Please sign in to comment.