Skip to content

Instantly share code, notes, and snippets.

@panesofglass
Last active November 22, 2023 15:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save panesofglass/8576ffc8276379656b909012c2def981 to your computer and use it in GitHub Desktop.
Save panesofglass/8576ffc8276379656b909012c2def981 to your computer and use it in GitHub Desktop.
Sample WinForms F# Script
#r "mscorlib.dll"
#r "System.dll"
open System
open System.Windows.Forms
type Update<'Msg, 'Model> = 'Msg -> 'Model -> 'Model
type Dispatch<'Msg> = 'Msg -> obj -> EventArgs -> unit
type View<'Model, 'Msg> = 'Model -> Dispatch<'Msg> -> Control
type Program<'Model, 'Msg>(initialModel:'Model, view:View<'Model,'Msg>, update:Update<'Msg,'Model>) =
let pump = Event<'Msg * 'Model>()
let evt = pump.Publish
let dispatch model msg _ _ = pump.Trigger(msg, model)
let form = new Form()
do evt.Add(fun (msg, model) ->
let newModel = update msg model
let newLayout = view newModel (dispatch newModel)
form.Controls.Clear()
form.Controls.Add(newLayout))
member __.Run() =
let initialLayout = view initialModel (dispatch initialModel)
form.Controls.Add(initialLayout)
form.ShowDialog()
type Model = int
let initialModel : Model = 0
type Msg = Increment | Decrement
let update msg model =
match msg with
| Increment -> model + 1
| Decrement -> model - 1
let view model dispatch =
let clickCount = new Label(Text=sprintf "Clicked %d times" model)
let incrButton = new Button(Text="+")
let incrClickHandler = EventHandler(dispatch Increment)
incrButton.Click.AddHandler(incrClickHandler)
let decrButton = new Button(Text="-")
let decrClickHandler = EventHandler(dispatch Decrement)
decrButton.Click.AddHandler(decrClickHandler)
let layout = new FlowLayoutPanel(Dock=DockStyle.Fill)
layout.Controls.Add(clickCount)
layout.Controls.Add(incrButton)
layout.Controls.Add(decrButton)
layout :> Control
let runProgram model view update =
let main = Program(model, view, update)
main.Run()
runProgram initialModel view update
#r "mscorlib.dll"
#r "System.dll"
open System
open System.IO
open System.Windows.Forms
let mutable counter = 0
let clickCount = new Label()
let message = new Label()
let button = new Button(Text = "Click me")
let clickHandler =
EventHandler(fun (sender: obj) (args: EventArgs) ->
message.Text <- sprintf "Hello from %A" sender
counter <- counter + 1
clickCount.Text <- sprintf "Clicked %d times" counter)
button.Click.AddHandler(clickHandler)
let layout = new FlowLayoutPanel(Dock=DockStyle.Fill)
layout.Controls.Add(message)
layout.Controls.Add(clickCount)
layout.Controls.Add(button)
let form = new Form()
form.Controls.Add(layout)
form.ShowDialog()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment