рдЙрджрд╛рд╣рд░рдг # F рдореЗрдВ рдореЙрдбрд▓-рд╡реНрдпреВ-рдЕрдкрдбреЗрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдЬреЗрдПрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА рдиреЗ Redux рдХреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛?


рдореБрдЭреЗ рд░рд┐рдбреНрдпреВрд╕рд░реНрд╕ рдореЗрдВ рдЕрдирд╛рдбрд╝реА рд╕реНрд╡рд┐рдЪ-рдХреЗрд╕ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛, рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдмреЗрд╣рддрд░ рдореЙрдбрд▓ рдИрд╡реЗрдВрдЯ рдФрд░ рдореЙрдбрд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдл #ред
рдпрд╣ рд▓реЗрдЦ рдПрд▓реНрдорд┐рд╢ рдореЗрдВ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ ред


рдореИрдВ рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдлрд┐рд░ рд╣рдо рдПрд▓реНрдорд┐рд╢ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗред


рдореИрдВрдиреЗ рдХрд╡рд┐рддрд╛рдПрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛, рдмреАрдЬ рдореЗрдВ рдХрдИ рдХрд╡рд┐рддрд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИрдВред


рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд╛рда рдХреА рдХреЗрд╡рд▓ 4 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, "рдЕрдк" рдФрд░ "рдбрд╛рдЙрди" рдмрдЯрди рджрдмрд╛рдХрд░ рдЖрдк рдХрд╡рд┐рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд┐рдЬрд┐рдЯрд▓ рдмрдЯрди рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд░рдВрдЧ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдмрдЯрди рдЖрдкрдХреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкреБрд╢реНрдХрд┐рди рдХреА рдХрд╡рд┐рддрд╛ рдкрдврд╝реА, рдЬреЛ рдпрд╛рд╕реАрди рдХреА рдХрд╡рд┐рддрд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдмрджрд▓ рдЧрдпрд╛ рдкрд╛рда рдХрд╛ рд░рдВрдЧ, рдФрд░ рдлрд┐рд░ рд╕реЛрдЪрд╛ рдХрд┐ рд░рдВрдЧ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдерд╛ рдФрд░ рдпрд╕рд┐рдирди рдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛, рдмрд╛рдПрдВ рддреАрд░ рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдЙрд╕рдиреЗ рдкреБрд╢реНрдХрд┐рди рдХреЛ рдкрдврд╝рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдерд╛ред


рдпрд╣ рдЪрдорддреНрдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдпрджрд┐ рдЖрдк рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдмрдЯрди рджрдмрд╛рдПрдВ, рдЗрд╕реЗ рджрдмрд╛рдХрд░ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдЗрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


  1. рд▓реЗрдЦрдХ рдмрджрд▓реЗрдВ
  2. рд░рдВрдЧ рдмрджрд▓реЗрдВ
  3. рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ (рдКрдкрд░ / рдиреАрдЪреЗ)
  4. рдкрд┐рдЫрд▓реЗ / рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЬрд╛рдПрдВ

рдЪреВрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдореЙрдбрд▓ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


type Msg = | ConsoleEvent of ConsoleKey | ChangeAuthor of Author | ChangeColor of ConsoleColor | ChangePosition of ChangePosition | ChangeVersion of ChangeVersion | RememberModel | WaitUserAction | Exit type ChangeVersion = | Back | Forward type ChangePosition = | Up | Down type Author = | Pushkin | Lermontov | Blok | Esenin type Poem = Poem of string 

рдореЙрдбрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрд╕ рдкрд╛рда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреМрди рд╕реЗ рдореЙрдбрд▓ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред


 type Model = { viewTextInfo: ViewTextInfo countVersionBack: int history: ViewTextInfo list } type ViewTextInfo = { text: string; formatText: string; countLines: int; positionY: int; color: ConsoleColor } 

рдПрд▓реНрдорд┐рд╢ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ - рдореЙрдбрд▓-рд╡реНрдпреВ-рдЕрдкрдбреЗрдЯ, рдореЙрдбрд▓ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ:


 let SnowAndUserActionView (model: Model) (dispatch: Msg -> unit) = let { formatText = ft; color = clr } = model.viewTextInfo; clearConsoleAndPrintTextWithColor ft clr let key = Console.ReadKey().Key; Msg.ConsoleEvent key |> dispatch let clearConsoleAndPrintTextWithColor (text: string) (color: ConsoleColor) = Console.Clear(); Console.WriteLine() Console.ForegroundColor <- color Console.WriteLine(text) 

рдпрд╣ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдпрд╣ viewTextInfo рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред
рдмрд╛рдж рдореЗрдВ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ , рдФрд░ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред


рдЕрдкрдбреЗрдЯ :


 let update (msg: Msg) (model: Model) = match msg with | ConsoleEvent key -> model, updateConsoleEvent key | ChangeAuthor author -> updateChangeAuthor model author | ChangeColor color -> updateChangeColor model color | ChangePosition position -> updateChangePosition model position | ChangeVersion version -> updateChangeVersion model version | RememberModel -> updateAddEvent model | WaitUserAction -> model, [] 

рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ , рдпрд╣ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред


рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдПрдХ рдЕрдкрдбреЗрдЯ рд╣реИ, рдмрдЯрди рдХреЛ рд╕рдВрджреЗрд╢ рдкрд░ рд▓рд╛ рд░рд╣рд╛ рд╣реИ , рдЕрдВрддрд┐рдо рдорд╛рдорд▓рд╛ - WaitUserAction рдШрдЯрдирд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдХреНрд▓рд┐рдХ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред


 let updateConsoleEvent (key: ConsoleKey) = let msg = match key with | ConsoleKey.D1 -> ChangeColor ConsoleColor.Red | ConsoleKey.D2 -> ChangeColor ConsoleColor.Green | ConsoleKey.D3 -> ChangeColor ConsoleColor.Blue | ConsoleKey.D4 -> ChangeColor ConsoleColor.Black | ConsoleKey.D5 -> ChangeColor ConsoleColor.Cyan | ConsoleKey.LeftArrow -> ChangeVersion Back | ConsoleKey.RightArrow -> ChangeVersion Forward | ConsoleKey.P -> ChangeAuthor Author.Pushkin | ConsoleKey.E -> ChangeAuthor Author.Esenin | ConsoleKey.B -> ChangeAuthor Author.Blok | ConsoleKey.L -> ChangeAuthor Author.Lermontov | ConsoleKey.UpArrow -> ChangePosition Up | ConsoleKey.DownArrow -> ChangePosition Down | ConsoleKey.X -> Exit | _ -> WaitUserAction msg |> Cmd.ofMsg 

рд╣рдо рд▓реЗрдЦрдХ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ countVersionBack рдХреЛ рддреБрд░рдВрдд 0 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд░рдВрдЧ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирдпрд╛ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


 let updateChangeAuthor (model: Model) (author: Author) = let (Poem updatedText) = seed.[author] let updatedFormatText = getlines updatedText 0 3 let updatedCountLines = (splitStr updatedText).Length let updatedViewTextInfo = {model.viewTextInfo with text = updatedText; formatText = updatedFormatText; countLines = updatedCountLines } { model with viewTextInfo = updatedViewTextInfo; countVersionBack = 0 }, Cmd.ofMsg RememberModel 

рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде, рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдореИрдореЛрдбреЗрд▓ рд╕рдВрджреЗрд╢ рднреА рднреЗрдЬрддреЗ рд╣реИрдВред


 let updateModelHistory model = { model with history = model.history @ [ model.viewTextInfo ] }, Cmd.ofMsg WaitUserAction 

рд╢реЗрд╖ рдЕрдкрдбреЗрдЯ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рджреВрдВрдЧрд╛:


рдкрд░реАрдХреНрд╖рдг

рд░рди рд╡рд┐рдзрд┐ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓реЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд╡реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред


 [<Property(Verbose=true)>] let ``    `` (authors: Author list) = let state = (createProgram (authors |> List.map ChangeAuthor) |> run) match (authors |> List.tryLast) with | Some s -> let (Poem text) = seed.[s] state.viewTextInfo.text = text | None -> true [<Property(Verbose=true)>] let ``    `` changeColorMsg = let state = (createProgram (changeColorMsg|>List.map ChangeColor)|> run) match (changeColorMsg |> List.tryLast) with | Some s -> state.viewTextInfo.color = s | None -> true [<Property(Verbose=true,Arbitrary=[|typeof<ChangeColorAuthorPosition>|])>] let ``        `` msgs = let tryLastSomeList list = list |> List.filter (Option.isSome) |> List.map (Option.get) |> List.tryLast let lastAuthor = msgs |> List.map (fun x -> match x with | ChangeAuthor a -> Some a | _ -> None) |> tryLastSomeList let lastColor = msgs |> List.map (fun x -> match x with | ChangeColor a -> Some a | _ -> None) |> tryLastSomeList let state = (createProgram msgs |> run) let colorTest = match lastColor with | Some s -> state.viewTextInfo.color = s | None -> true let authorTest = match lastAuthor with | Some s -> let (Poem t) = seed.[s]; state.viewTextInfo.text = t | None -> true authorTest && colorTest 

рдЗрд╕рдХреЗ рд▓рд┐рдП, FsCheck рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдЕрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдореВрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдПрд▓реНрдорд┐рд╢ рдореЗрдВ рдХреЛрдб рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ ( рдореВрд▓ рдХреЛрдб) :


 type Dispatch<'msg> = 'msg -> unit type Sub<'msg> = Dispatch<'msg> -> unit type Cmd<'msg> = Sub<'msg> list type Program<'model, 'msg, 'view> = { init: unit ->'model * Cmd<'msg> update: 'msg -> 'model -> ('model * Cmd<'msg>) setState: 'model -> 'msg -> Dispatch<'msg> -> unit } let runWith<'arg, 'model, 'msg, 'view> (program: Program<'model, 'msg, 'view>) = let (initModel, initCmd) = program.init() //1 let mutable state = initModel //2 let mutable reentered = false //3 let buffer = RingBuffer 10 //4 let rec dispatch msg = let mutable nextMsg = Some msg; //5 if reentered //6 then buffer.Push msg //7 else while Option.isSome nextMsg do // 8 reentered <- true // 9 let (model, cmd) = program.update nextMsg.Value state // 9 program.setState model nextMsg.Value dispatch // 10 Cmd.exec dispatch cmd |> ignore //11 state <- model; // 12 nextMsg <- buffer.Pop() // 13 reentered <- false; // 14 Cmd.exec dispatch initCmd |> ignore // 15 state //16 let run program = runWith program 

Dispath <'msg> рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЗрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрджреЗрд╢ рдФрд░ рд░рд┐рдЯрд░реНрди рдЗрдХрд╛рдИ рд▓реЗрддрд╛ рд╣реИ
рдЙрдк <'msg> - рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдлрд╝рдВрдХреНрд╢рди, рдбрд┐рд╕реНрдкреИрдЪ рдФрд░ рд░рд┐рдЯрд░реНрди рдпреВрдирд┐рдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╕рдмрд╕ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдкреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :


 let ofMsg<'msg> (msg: 'msg): Cmd<'msg> = [ fun (dispatch: Dispatch<'msg>) -> dispatch msg ] 

рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреИрд╕реЗ рдХрд┐ Cmd.ofMsg рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдЕрдкрдбреЗрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВрдореЙрдбрд▓ рд╡рд┐рдзрд┐, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ
Cmd <'msg> - рд╢реАрдЯ рдЙрдк <' msg>


рдЪрд▓реЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рдХрд╛рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдпрд╣ рдореЙрдбрд▓, рд╕рдВрджреЗрд╢ рдФрд░ рджреГрд╢реНрдп рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рджреГрд╢реНрдп рд╕реЗ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд▓реНрдорд┐рд╢ рдореЗрдВред рдпрд╣ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ DOM рдЯреНрд░реА рдХреЗ F # рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред


Init рдлрд╝реАрд▓реНрдб рдХреЛ рдПрд▓реНрдорд┐рд╢ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореЙрдбрд▓ рдФрд░ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ Cmd.ofMsg рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВрдореЙрдбрд▓
рдЕрдкрдбреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред


SetState - рдорд╛рдирдХ рдПрд▓реНрдорд┐рд╢ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЗрд╖рдг рдФрд░ рдХреЙрд▓ рд╡реНрдпреВ рджреЗрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреГрд╢реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП msg рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдореИрд╕реЗрдЬ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред


рд░рдирд╡рд┐рде рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рдХреЙрд▓ рдЗрдирд┐рдЯ , рдореЙрдбрд▓ рдФрд░ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддрд░реНрдЬ рдкрд░ 2,3 рджреЛ рдкрд░рд╕реНрдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ - рдЬрд┐рд╕рдореЗрдВ рд░рд╛рдЬреНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░рд╛ рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


4 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдкрд░, рдмрдлрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЖрдпрд╛ рдерд╛ - рдкрд╣рд▓рд╛ рдмрд╛рд╣рд░ рдЖрдпрд╛ рдерд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рд┐рдВрдЧ рдмрдлрд╝рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд▓рд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЧреАрдереВрдм рдХреЗ рд╕рд╛рде рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ)


рдЗрд╕рдХреЗ рдмрд╛рдж рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░реЗрд╖рдг рдХрд╛рд░реНрдп рдЖрддрд╛ рд╣реИ, рд╡рд╣реА рдЬрд┐рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░, рд╣рдо рд▓рд╛рдЗрди 6 рдкрд░ рд▓рд╛рдЗрди рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рд▓реВрдк рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдЗрд╕ рд▓реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рди рдЬрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдЬреЛрдбрд╝реЗрдВ рдмрдлрд░ рдореЗрдВ рдирдпрд╛ рд╕рдВрджреЗрд╢ред


рд▓рд╛рдЗрди 9 рдкрд░, рд╣рдо рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдмрджрд▓реЗ рд╣реБрдП рдореЙрдбрд▓ рдФрд░ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЪреБрдирддреЗ рд╣реИрдВ (рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдпрд╛рдж рд░рдЦреЗрдВ рд╕рдВрджреЗрд╢ рд╣реИ)
рд▓рд╛рдЗрди 10 рдореЙрдбрд▓ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рд╕реЗрдЯрд╕реНрдЯреНрд░реЗрдЯ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рдкреЛрд╕реНрдЯ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ
рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХрдВрд╕реЛрд▓ ред рд░реАрдбрд▓рд╛рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдореЗрдВрдбрдореЛрдбреЗрд▓, рдЪреЗрдВрдЬрдХреЛрд▓рд░ (рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрджрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ) рдЬреИрд╕реЗ рдЗрд╡реЗрдВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд╕ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд░рдВрдЧред


рдкрд╣рд▓реА рдмрд╛рд░, OnlyShowView рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ WaitMserAction рд╕рдВрджреЗрд╢ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрдпрд╛ рд╣реИ, рддреЛ ShowAndUserActionView рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдореЙрдбрд▓ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░реЗрдЧрд╛, рдмрдЯрди рджрдмрд╛рдП рдЬрд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рд╣реА рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рд╕рдВрджреЗрд╢ рдмрдлрд░ рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ reenvited = рдЧрд▓рдд рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ )


рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдЖрдП рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЦреЛ рджреЗрдВрдЧреЗ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗрд╡рд▓ рддрднреА рд▓реВрдк рдореЗрдВ рдЖрдПрдВрдЧреЗ рдЬрдм рдкреНрд░рддрд┐рд╢реЛрдз рдЭреВрдард╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓рд╛рдЗрди 11 рдЬрдЯрд┐рд▓ рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдмрдлрд░ рдореЗрдВ рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдзрдХреНрдХрд╛ рд╣реИ:


 let exec<'msg> (dispatch: Dispatch<'msg>) (cmd: Cmd<'msg>) = cmd |> List.map (fun sub -> sub dispatch) 

рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯреЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЗрд╖рдг рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред


рдкрдВрдХреНрддрд┐ 12 рдкрд░ рд╣рдо рдореЙрдбрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдмрдлрд░ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЭреВрдареЗ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ рдФрд░ рдкреНрд░реЗрд╖рдг рдХреЗрд╡рд▓ рджреГрд╢реНрдп рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╕рдм рдХреБрдЫ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд▓рд╛рдЗрди 10 рдкрд░ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбрд┐рд╕реНрдкреИрдЪ рдХреЙрд▓ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдб рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдмреИрдХ рд╕реЗ рдбрд┐рд╕реНрдкреИрдЪ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЦреИрд░, рдпрд╣ рдкреНрд░реЗрд╖рдг рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рд▓рд╛рдЗрди 15 рдкрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрди 16 рдкрд░ рд░рд╛рдЬреНрдп рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред


рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЬрдм рдмрдлрд░ рдЦрд╛рд▓реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддрдм рдирд┐рдХрд╛рд╕ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд░рдирд╡рд┐рде рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдЕрд╕рдВрднрд╡ рд╣реИред


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрд▓рдЧ рд╣реИ, createProgram рдлрд╝рдВрдХреНрд╢рди рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛ рдФрд░ SetState рдореЗрдВ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд▓рд┐рдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


рдореЗрд░реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдореВрд▓ рдПрдХ рдХреЗ рдмреАрдЪ рдПрдХ рдФрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рд╕реЗрдЯрд╕реНрдЯреИрдЯ рдлрд╝рдВрдХреНрд╢рди , рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдлрд┐рд░ рдореИрд╕реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдХреЙрдирд╕реЛрд▓ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХреЙрд▓ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд░реАрдбрдХреА (рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛) рджреЗрдЦреЗрдВ )


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдХрд┐ рдПрд▓реНрдорд┐рд╢ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХрд╛рдлреА рдПрд▓реНрдорд┐рд╢ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдУрд╡рд░рдмреЛрд░реНрдб рдмрдиреА рд╣реБрдИ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЙрдирдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi459870/


All Articles