Last active
April 17, 2020 11:31
-
-
Save BashkaMen/4f043e3aa40dbb47f86e054fee39602b to your computer and use it in GitHub Desktop.
TODO F#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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