Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- type User = string
- type Title = string
- type BugState =
- | New
- | Assigned of User
- | Deferred
- | Closed
- type Bug =
- { Id : Guid
- Title : Title
- State : BugState
- }
- let sendEmailToAssignee assignee message bug =
- printfn "@%s, RE %s: %s" assignee bug.Title message
- bug
- type Trigger =
- | Assign of User
- | Defer
- | Close
- let cantApply trigger bug =
- printfn "ERROR: Can't apply trigger %A to ticket in state %A" trigger bug.State
- bug
- let FSM trigger bug =
- match bug.State, trigger with
- | Assigned oldUser, Assign newUser when oldUser <> newUser ->
- { bug with State = Assigned newUser }
- |> sendEmailToAssignee oldUser "Don't forget to help the new employee!"
- |> sendEmailToAssignee newUser "You own it."
- | New, Assign user
- | Deferred, Assign user ->
- { bug with State = Assigned user }
- |> sendEmailToAssignee user "You own it."
- | New, Defer ->
- { bug with State = Deferred }
- | Assigned user, Defer ->
- sendEmailToAssignee user "You're off the hook."
- { bug with State = Deferred }
- | Assigned _, Close ->
- { bug with State = Closed }
- | _, _ ->
- cantApply trigger bug
- { Id = Guid.NewGuid()
- Title = "Incorrect stock count"
- State = New }
- |> FSM (Assign "Joe")
- |> FSM Defer
- |> FSM (Assign "Harry")
- |> FSM (Assign "Fred")
- |> FSM Close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement