Advertisement
Guest User

Untitled

a guest
Mar 12th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 6.53 KB | None | 0 0
  1. //Project $safeprojectname$
  2. //Created by Björn Dagerman 2015/05 (dagerman@kth.se)
  3. // Fixed typo (changed FSharp -> FSharpx), Björn L 2017-02-27
  4. //
  5. //Main
  6. namespace Lab4
  7. open FSharpx.Control.Observable //Fsharpx
  8. open Tree
  9. open Calculator
  10. open BST
  11. open System.Drawing
  12.  
  13.    
  14.  
  15. module Main =
  16.  
  17.     let convertOperator s =
  18.         match s with
  19.         | "+" -> Add
  20.         | "-" -> Sub
  21.         | "/" -> Div
  22.         | "*" -> Mul
  23.    
  24.     let isOperator s =
  25.         match s with
  26.         | "+" | "-" | "*" | "/" -> true
  27.         | _ -> false
  28.  
  29.  
  30.     let rec tempEval list =
  31.         match list with
  32.         | [h1] when not (isOperator h1) -> leaf (parseFloat h1)
  33.         | h1::h2 when isOperator h1 -> tempEval h2
  34.         | h1::h2::tail when not (isOperator h1) && not (isOperator h2) -> tempEval ((h1+h2)::tail)
  35.         | h1::h2::tail when isOperator h2 -> (expr (leaf (parseFloat h1)) (convertOperator h2) (tempEval tail))
  36.         | _ -> leaf (C 0.0)
  37.  
  38.  
  39.  
  40.     //This main function loops using async and Async.Await. See lecture F13 for alternatives.
  41.     let rec loop observable list = async{
  42.         //At the start we do the computations that we can do with the inputs we have, just as in a regular application
  43.         let updateDisplay = Gui.display.Text <- list |> List.fold (+) ""
  44.  
  45.         let applyDot list =
  46.             Gui.btndot.Enabled <- false
  47.             list
  48.  
  49.         let applyOperator list =
  50.             Gui.btndot.Enabled <- true
  51.             list
  52.  
  53.         printfn "%A" list
  54.    
  55.         //Next, since we don't have all inputs (yet) we need to wait for them to become available (Async.Await)
  56.         //let! (bang) enables execution to continue on other computations and threads.
  57.         let! somethingObservable = Async.AwaitObservable(observable)
  58.  
  59.         //Now that we have recieved a new input we can perform the rest of our computations
  60.         match somethingObservable with  
  61.             | "0"     -> return! loop observable (list@["0"])
  62.             | "1"     -> return! loop observable (list@["1"])
  63.             | "2"     -> return! loop observable (list@["2"])
  64.             | "3"     -> return! loop observable (list@["3"])
  65.             | "4"     -> return! loop observable (list@["4"])
  66.             | "5"     -> return! loop observable (list@["5"])
  67.             | "6"     -> return! loop observable (list@["6"])
  68.             | "7"     -> return! loop observable (list@["7"])
  69.             | "8"     -> return! loop observable (list@["8"])
  70.             | "9"     -> return! loop observable (list@["9"])
  71.             | "+"   -> return! loop observable (applyOperator list@["+"])    // Add
  72.             | "-"   -> return! loop observable (applyOperator list@["-"])    // Sub
  73.             | "*"   -> return! loop observable (applyOperator list@["*"])    // Div
  74.             | "/"   -> return! loop observable (applyOperator list@["/"])    // Mul
  75.             | "."   -> return! loop observable (applyDot list@["."])    // dot
  76.             | "="   -> return! loop observable ([(string (eval (tempEval (applyOperator list))))])
  77.             | "clear" -> return! loop observable (applyOperator [])
  78.             | _     -> failwith "Not implemented yet!"
  79.         //The last thing we do is a recursive call to ourselves, thus looping
  80.     }
  81.     //The GuiInterface is tightly coupled with the main loop which is its only intented user, thus the nested module
  82.     module GuiInterface =
  83.  
  84.         let btns = [Gui.btn0; Gui.btn1; Gui.btn2; Gui.btn3; Gui.btn3; Gui.btn4; Gui.btn5; Gui.btn6; Gui.btn7; Gui.btn8; Gui.btn9;]
  85.         //Here we define what we will be observing (clicks)
  86.         let observables =
  87.             Observable.merge
  88.             <| Observable.map (fun _-> "0") Gui.btn0.Click //The map transforms the observation (click) by the given function. In our case this means
  89.             <| (Observable.merge
  90.                 <| Observable.map (fun _-> "1") Gui.btn1.Click //that clicking the button AddX will return X. Note the type of observables : IObservable<int>
  91.                 <| (Observable.merge
  92.                     <| Observable.map (fun _-> "2") Gui.btn2.Click
  93.                     <| (Observable.merge
  94.                         <| Observable.map (fun _-> "3") Gui.btn3.Click
  95.                         <| (Observable.merge
  96.                             <| Observable.map (fun _-> "4") Gui.btn4.Click
  97.                             <| (Observable.merge
  98.                                 <| Observable.map (fun _-> "5") Gui.btn5.Click
  99.                                 <| (Observable.merge
  100.                                     <| Observable.map (fun _-> "6") Gui.btn6.Click
  101.                                     <| (Observable.merge    
  102.                                         <| Observable.map (fun _-> "7") Gui.btn7.Click
  103.                                         <| (Observable.merge
  104.                                             <| Observable.map (fun _-> "8") Gui.btn8.Click
  105.                                             <| (Observable.merge
  106.                                                 <| Observable.map (fun _-> "9") Gui.btn9.Click
  107.                                                 <| (Observable.merge
  108.                                                     <| Observable.map (fun _-> "+") Gui.btnAdd.Click
  109.                                                     <| (Observable.merge
  110.                                                         <| Observable.map (fun _-> "-") Gui.btnSub.Click
  111.                                                         <| (Observable.merge    
  112.                                                             <| Observable.map (fun _-> "/") Gui.btnDivide.Click
  113.                                                             <| (Observable.merge
  114.                                                                 <| Observable.map (fun _-> "*") Gui.btnMultiply.Click
  115.                                                                 <| (Observable.merge
  116.                                                                     <| Observable.map (fun _-> ".") Gui.btndot.Click
  117.                                                                     <| (Observable.merge
  118.                                                                         <| Observable.map (fun _-> "clear") Gui.btnClear.Click
  119.                                                                         <| Observable.map (fun _-> "=") Gui.btnEquals.Click
  120.                                                                             )))))))))))))))
  121.     //Starts the main loop and opens the Gui
  122.     Async.StartImmediate(loop GuiInterface.observables []); System.Windows.Forms.Application.Run(Gui.form)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement