MVU F# как избежать утечки памяти
От: Разраб  
Дата: 17.10.23 03:56
Оценка:
Есть вот такой код.
функция view каждый раз возвращает новый элемент управления, т.к. чистая.
Получается ФП не работает с Winforms? Нужны элементы ООП, чтобы избежать дикого оверхеда?

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(Text = "OK")

    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
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.