Skip to content

Instantly share code, notes, and snippets.

@adicirstei
Last active April 4, 2022 17:17
Show Gist options
  • Save adicirstei/8252693570dc387b4f24 to your computer and use it in GitHub Desktop.
Save adicirstei/8252693570dc387b4f24 to your computer and use it in GitHub Desktop.
Fully reactive UI in F# with observables
open System
open System.Windows.Forms
open System.Drawing
type Action =
| Increment
| Decrement
let form = new Form(Width= 400, Height = 300, Visible = true, Text = "Hello World")
form.TopMost <- true
let panel = new FlowLayoutPanel()
panel.Dock <- DockStyle.Fill
panel.WrapContents <- false
let incBtn = new Button()
let decBtn = new Button()
let label = new Label()
incBtn.Text <- "+"
decBtn.Text <- "-"
incBtn.AutoSize <- true
decBtn.AutoSize <- true
panel.Controls.Add(incBtn)
panel.Controls.Add(label)
panel.Controls.Add(decBtn)
let model = 0
let view model =
label.Text <- sprintf "%d" model
let update (model : int32) (action : Action) =
match action with
| Increment -> model + 1
| Decrement -> model - 1
let increment = Control.Observable.map (fun _ -> Increment) incBtn.Click
let decrement = Control.Observable.map (fun _ -> Decrement) decBtn.Click
let actions = Control.Observable.merge increment decrement
let stateObservable = Control.Observable.scan update model actions
Control.Observable.subscribe view stateObservable
form.Controls.Add(panel)
form.Show()
@adicirstei
Copy link
Author

This is inspired by Elm architecture.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment