A thin F# wrapper around SQLStreamStore, and SqlStreamStore.Postgres.
- Provides a nice API to interact with SqlStreamStore from F#
- Wraps all functions that can throw in
Async<Result<'a, exn>>
This quick usage guide presumes familiarity with SQLStreamStore. A more in-depth guide and documentation are coming soon :)
Use the Create module.
openSqlStreamStoreopenSqlStreamStore.FSharpopenSystem// A new in memory storeletinMemStore:IStreamStore = Create.inMemoryStore()letconfig:PostgresConfig ={
host = Environment.GetEnvironmentVariable "HOST"
port = Environment.GetEnvironmentVariable "PORT"
username = Environment.GetEnvironmentVariable "USERNAME"
password = Environment.GetEnvironmentVariable "PASSWORD"
database = Environment.GetEnvironmentVariable "DATABASE"}// A new PostgresStore with a custom schema (use None if you want the tables to be created in public)letpostgresStore:PostgresStreamStore = Create.postgresStore config (Some "my-cool-schema")// Cast to IStreamStoreletstore:IStreamStore = postgresStore :> IStreamStore // Or create schema if this is the first run
store |> Create.schemaIfNotExists // : Async<Result<IStreamStore,exn>>Use the Connect module to connect to the stream you want to append to, and then use the Append module to append
messages or events.
open ...typeMyEvent=| Hi
| Greeting ofGreetingandGreeting={data:string}leteventToAppend:NewStreamEvent<MyEvent>= Greeting {data ="hello there!"}|> NewStreamEvent.create "me"// Given an IStreamStore called store
store // IStreamStore|> Connect.toStream "my-cool-stream"// Stream|> Append.streamEvents [eventToAppend]// AsyncResult<AppendResult, exn>Use the Read module to read the stream and then the Get module to get some data without having to bind the result of
the read operation.
open ...// Using the MyType declared before and an IStreamStore called store
store // IStreamStore|> Connect.toStream "my-cool-stream"// Stream |> Read.entire // Async<Result<ReadStreamPage,exn>>|> Get.messagesData // Async<Result<string,exn>> What if I want to read the stream backwards and specify if I want to prefetch the data, and all the cool stuff that already exists in SQLStreamStore?
Well each of the above functions has an alternative version call that has a ' at the end for the function's name. The
alternative function takes a list of options as a parameter.
Because 90% of the time these options aren't used, and this is an elegant way to hide them without having to use builder-pattern.
open ...// Using the MyType declared before and an IStreamStore called store
store // IStreamStore|> Connect.toStream "my-cool-stream"// Stream |> Read.entire' [
ReadEntireOption.FromVersionInclusive 50
ReadEntireOption.NoPrefetch
ReadEntireOption.ReadBackwards
]// Async<Result<ReadStreamPage,exn>>|> Get.messagesData // Async<Result<string,exn>>