Last active
November 22, 2023 15:30
-
-
Save panesofglass/8576ffc8276379656b909012c2def981 to your computer and use it in GitHub Desktop.
Sample WinForms F# Script
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
#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 |
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
#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