Advertisement
Guest User

Untitled

a guest
May 2nd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.30 KB | None | 0 0
  1. open System
  2. //open Akka.FSharp
  3. open Akka.FSharp
  4.  
  5. let inline (^) f x = f x
  6.  
  7. let system = System.create "my-system" (Configuration.load())
  8.  
  9.  
  10.  
  11.     //let sagaActor =
  12.     //    spawn system "saga-handler-actor"
  13.     //        (fun mailbox ->
  14.     //            let rec loop() = actor {
  15.  
  16.     //                let! message = mailbox.Receive()
  17.  
  18.     //                let events = commandHandler message
  19.  
  20.     //                //saga-event-listener
  21.                    
  22.     //                //wait
  23.  
  24.     //                //check if events are ok
  25.  
  26.     //                //parent <! Tell
  27.  
  28.     //                return! loop()
  29.     //            }
  30.     //            loop())
  31.    
  32.  
  33.     //let eventHandlerActor =
  34.     //    spawn system "command-handler-actor"
  35.     //        (fun mailbox ->
  36.     //            let rec loop() = actor {
  37.  
  38.     //                let! message = mailbox.Receive()
  39.  
  40.     //                eventHandler message
  41.  
  42.     //                return! loop()
  43.     //            }
  44.     //            loop())
  45.  
  46.     //let requestHandlerActor =
  47.     //    spawn system "request-handler-actor"
  48.     //        (fun mailbox ->
  49.     //            let rec loop() = actor {
  50.  
  51.     //                let! message = mailbox.Receive()
  52.  
  53.     //                //sagaActor <! message
  54.     //                //create child actor for handle command ::commandHandlerActor::
  55.     //                // handle an incoming message
  56.     //                return! loop()
  57.     //            }
  58.     //            loop())
  59.        
  60.  
  61. type Cmd =
  62.     | CreateUser of string
  63.     | RemoveUser of Guid
  64.  
  65. type Evt =
  66.     | UserCreated of Guid * string
  67.     | UserRemoved of Guid
  68.  
  69. let idGenerator () = Guid.NewGuid()
  70.  
  71. let createUser name =
  72.     if not <| String.IsNullOrEmpty name then
  73.         [UserCreated (idGenerator(), name)]
  74.     else
  75.         []
  76.  
  77. let commandHandler cmd =
  78.     match cmd with
  79.     | CreateUser name ->
  80.         createUser name
  81.     | RemoveUser id -> []
  82.  
  83.  
  84. let eventHandler evt =
  85.     match evt with
  86.     | CreateUser name -> ()
  87.     | RemoveUser id -> ()
  88.  
  89. type Command = unit
  90.  
  91. type ForwardCommand = Forward of Command
  92. type BackwardCommand = Backward of Command
  93.  
  94. [<RequireQualifiedAccessAttribute>]
  95. type SagaState =
  96.     | Empty
  97.     | Fill of ForwardCommand list
  98.     | Forward of Currect: ForwardCommand * Remains: ForwardCommand list * Completed: ForwardCommand list
  99.     | Backward of Currect: BackwardCommand * Remains: BackwardCommand list * Completed: BackwardCommand list * ForwardCompleted: ForwardCommand list * ForwardRemains : ForwardCommand list
  100.     | BackwardAbort of FailCommand: BackwardCommand * Remains: BackwardCommand list * Completed: BackwardCommand list * ForwardCompleted: ForwardCommand list * ForwardRemains : ForwardCommand list
  101.     | ForwardComplete of Completed: ForwardCommand list
  102.     | BackwardComplete of Completed: BackwardCommand list * ForwardCompleted: ForwardCommand list * ForwardRemains : ForwardCommand list
  103.  
  104. [<RequireQualifiedAccessAttribute>]
  105. type SagaEvent =
  106.     | SagaForwardCommandAdded of ForwardCommand
  107.     | Started
  108.     | Forwarded
  109.     | ForwardFailed
  110.     | Backwarded
  111.     | BackwardFailed
  112.     | ForwardDone
  113.     | BackwardDone
  114.  
  115. let initSaga = SagaState.Empty
  116.  
  117. let forwardToBackward (Forward cmd) = Backward cmd
  118.  
  119. let applyEvent state event =
  120.     match state, event with
  121.     | SagaState.Empty, SagaEvent.SagaForwardCommandAdded cmd ->
  122.         SagaState.Fill ^ [cmd]
  123.  
  124.     | SagaState.Fill cmds, SagaEvent.SagaForwardCommandAdded cmd ->
  125.         SagaState.Fill ^ (cmd :: cmds)
  126.  
  127.     | SagaState.Fill (c::cs), SagaEvent.Started ->
  128.         SagaState.Forward (c, cs |> List.rev, [])
  129.  
  130.     | SagaState.Forward (current, next::remains, completed), SagaEvent.Forwarded ->
  131.         SagaState.Forward (next, remains, current::completed)
  132.  
  133.     | SagaState.Forward (current, [], completed), SagaEvent.Forwarded ->
  134.         SagaState.ForwardComplete (current::completed)
  135.  
  136.     | SagaState.Forward (current, remains, completed), SagaEvent.ForwardFailed ->
  137.         SagaState.Backward (current |> forwardToBackward, completed |> List.map forwardToBackward, [], completed, current::remains)
  138.  
  139.     | SagaState.Backward (current, next::remains, completed, forwardCompleted, forwardRemains), SagaEvent.Backwarded ->
  140.         SagaState.Backward (next, remains, current::completed, forwardCompleted, forwardRemains)
  141.  
  142.     | SagaState.Backward (current, [], completed, forwardCompleted, forwardRemains), SagaEvent.Backwarded ->
  143.         SagaState.BackwardComplete (current::completed, forwardCompleted, forwardRemains)
  144.  
  145.     | SagaState.Backward (current, remains, completed, forwardCompleted, forwardRemains), SagaEvent.BackwardFailed ->
  146.         SagaState.BackwardAbort (current, remains, completed, forwardCompleted, forwardRemains)
  147.     | state, event -> failwith (sprintf "Wrong state %A %A" state event)
  148.  
  149. let playEvents state events = events |> List.fold applyEvent state
  150.  
  151. [<EntryPoint>]
  152. let main argv =
  153.  
  154.     let testSaga =
  155.         [SagaEvent.SagaForwardCommandAdded ^ Forward ()
  156.          SagaEvent.SagaForwardCommandAdded ^ Forward ()
  157.          SagaEvent.Started
  158.          SagaEvent.Forwarded
  159.          SagaEvent.ForwardFailed
  160.          SagaEvent.Backwarded
  161.          SagaEvent.BackwardFailed]
  162.         |> playEvents initSaga
  163.    
  164.     printf "%A" testSaga
  165.  
  166.     Console.ReadKey() |> ignore
  167.     0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement