@@ -5,6 +5,7 @@ open SqlStreamStore.Streams
5
5
6
6
module Get =
7
7
8
+ // A function to help wit type inference in this module
8
9
let private curriedMap : ( ReadStreamPage -> 'a ) -> AsyncResult < ReadStreamPage , exn > -> AsyncResult < 'a , exn > =
9
10
AsyncResult.map
10
11
@@ -37,6 +38,39 @@ module Get =
37
38
let nextStreamVersion =
38
39
curriedMap ( fun page -> page.NextStreamVersion)
39
40
41
+ let nextStreamPage =
42
+ AsyncResult.bind ( fun ( page : ReadStreamPage ) -> page.ReadNext |> AsyncResult.ofTask)
43
+
44
+ module GetAll =
45
+
46
+ // A function to help wit type inference in this module
47
+ let private curriedMap : ( ReadAllPage -> 'a ) -> AsyncResult < ReadAllPage , exn > -> AsyncResult < 'a , exn > =
48
+ AsyncResult.map
49
+
50
+ let messages =
51
+ curriedMap ( fun page -> page.Messages |> Array.toList)
52
+
53
+ let messagesData =
54
+ messages
55
+ >> AsyncResult.bind ( List.traverseAsyncResultM ( fun msg -> msg.GetJsonData()))
56
+
57
+ let messagesDataAs < 'data > =
58
+ messages
59
+ >> AsyncResult.bind ( List.traverseAsyncResultM ( fun msg -> msg.GetJsonDataAs< 'data>()))
60
+
61
+ let direction = curriedMap ( fun page -> page.Direction)
62
+
63
+ let fromPosition =
64
+ curriedMap ( fun page -> page.FromPosition)
65
+
66
+ let isEnd = curriedMap ( fun page -> page.IsEnd)
67
+
68
+ let nextPosition =
69
+ curriedMap ( fun page -> page.NextPosition)
70
+
71
+ let nextAllStreamPage =
72
+ AsyncResult.bind ( fun ( page : ReadAllPage ) -> page.ReadNext |> AsyncResult.ofTask)
73
+
40
74
41
75
namespace SqlStreamStore.FSharp.EventSourcing
42
76
@@ -59,6 +93,10 @@ module Get =
59
93
events< 'event>
60
94
>> AsyncResult.bind ( List.traverseAsyncResultM ( fun event -> event.data))
61
95
96
+ let eventDataAsString < 'event > =
97
+ events< 'event>
98
+ >> AsyncResult.bind ( List.traverseAsyncResultM ( fun event -> event.dataAsString))
99
+
62
100
let eventsAndEventsData < 'event > =
63
101
fun ( page : AsyncResult < ReadStreamPage , exn >) ->
64
102
asyncResult {
@@ -67,6 +105,28 @@ module Get =
67
105
return List.zip events' data
68
106
}
69
107
108
+ module GetAll =
109
+ let events < 'event > =
110
+ GetAll.messages
111
+ >> Async.map (
112
+ Result.bind (
113
+ List.filter ( fun msg -> Seq.contains msg.Type ( getEventUnionCases< 'event> ()))
114
+ >> List.traverseResultM StreamEvent.ofStreamMessage< 'event>
115
+ )
116
+ )
117
+
118
+ let eventsData < 'event > =
119
+ events< 'event>
120
+ >> AsyncResult.bind ( List.traverseAsyncResultM ( fun event -> event.data))
121
+
70
122
let eventDataAsString < 'event > =
71
123
events< 'event>
72
124
>> AsyncResult.bind ( List.traverseAsyncResultM ( fun event -> event.dataAsString))
125
+
126
+ let eventsAndEventsData < 'event > =
127
+ fun ( page : AsyncResult < ReadAllPage , exn >) ->
128
+ asyncResult {
129
+ let! events ' = events< 'event> page
130
+ let! data = List.traverseAsyncResultM ( fun event -> event.data) events'
131
+ return List.zip events' data
132
+ }
0 commit comments