Skip to content

Instantly share code, notes, and snippets.

@BashkaMen
Last active April 17, 2020 11:31
Show Gist options
  • Save BashkaMen/4f043e3aa40dbb47f86e054fee39602b to your computer and use it in GitHub Desktop.
Save BashkaMen/4f043e3aa40dbb47f86e054fee39602b to your computer and use it in GitHub Desktop.
TODO F#
type IStore =
abstract member GetState : unit -> Async<'T>
abstract member SaveState: 'T -> Async<unit>
type IServiceProvider =
abstract member Resolve : unit -> 'T
type GetTodoListQuery = unit
type AddCommand = { Title: string; }
type RemoveCommand = { Id: Id; }
type CompleteCommand = { Id: Id; }
type Command =
| Add of AddCommand
| Remove of RemoveCommand
| Complete of CompleteCommand
type Query =
| GetState of GetTodoListQuery
let handleAdd (store: IStore) (cmd: AddCommand) =
async {
let! state = store.GetState()
let todo = Todo.create cmd.Title
let newState = state |> Todo.add todo
do! store.SaveState newState
}
let handleRemove (store: IStore) (cmd: RemoveCommand) =
async {
let! state = store.GetState()
let newState = state |> Todo.remove cmd.Id
do! store.SaveState newState
}
let handleComplete (store: IStore) (cmd: CompleteCommand) =
async {
let! state = store.GetState()
let newState = state |> Todo.complete cmd.Id
do! store.SaveState newState
}
let handleGetState (store: IStore) (cmd: GetTodoListQuery) =
async {
return! store.GetState()
}
let mutable providerResolver: Func<IServiceProvider> = null
let dep = providerResolver.Invoke()
let CommandHandler (cmd) =
async {
do! match cmd with
| Add s -> handleAdd (dep.Resolve()) s
| Remove s -> handleRemove (dep.Resolve()) s
| Complete s -> handleComplete (dep.Resolve()) s
return ()
}
let QueryHandler (query) =
async {
return! match query with
| GetState s -> handleGetState (dep.Resolve()) s
}
//------------usage example------------//
type HttRequest =
abstract member ExtractCmd : unit -> Command
type HttpResponse =
static member Ok() = 200
let processRequest (ctx: HttRequest) =
async {
let cmd = ctx.ExtractCmd()
do! CommandHandler cmd
return HttpResponse.Ok()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment