Created
October 19, 2015 00:55
-
-
Save cloudRoutine/885d02af0b05b944c52f to your computer and use it in GitHub Desktop.
Components and Events
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
type message = string | |
let logEvent = Event<message> () | |
let logStream, post = logEvent.Publish, logEvent.Trigger | |
logStream.Add <| printf "%s | " | |
let dispose (d:#IDisposable) = d.Dispose() | |
type Component ( reciever : IEvent<message> | |
, sender : Event<message> | |
, name : string | |
, data : decimal | |
, pattern : string | |
, special : unit -> string ) = | |
let connection = | |
reciever.Subscribe (fun order -> | |
match order with | |
| "NAME" -> post name | |
| "DATA" -> post <| string data | |
| "SPECIAL" -> special() |> post | |
| x when x = pattern -> post <| sprintf "\n- REDISPATCH FROM :: %s -\n" name | |
sender.Trigger "NAME" | |
| _ -> post "unknown order" | |
) | |
interface IDisposable with member __.Dispose () = connection.Dispose() | |
type Entity (name : string) = | |
let broadCastEvent = Event<message> () | |
let broadCastStream = broadCastEvent.Publish | |
let components = ResizeArray() | |
member __.Name = name | |
member __.AddComponent (mkComp : IEvent<message> -> Event<message> -> Component) = | |
components.Add <| (mkComp broadCastStream broadCastEvent :> IDisposable) | |
member __.Dispatch order = broadCastEvent.Trigger order | |
interface IDisposable with | |
member __.Dispose () = | |
components |> Seq.iter dispose | |
components.Clear() | |
;; | |
let ent = new Entity "--ENT--" | |
ent.AddComponent (fun r s -> new Component(r,s,"C1",999m,"A",(fun()->"salutations"))) | |
ent.AddComponent (fun r s -> new Component(r,s,"C2",505m,"B",(fun()->string System.DateTime.Now))) | |
let rng = System.Random() | |
ent.AddComponent (fun r s -> new Component(r,s,"C3",640m,"AGAIN",(fun()->rng.Next()|>string))) | |
;; | |
ent.Dispatch "NAME" ;; | |
ent.Dispatch "DATA" ;; | |
ent.Dispatch "SPECIAL" ;; | |
ent.Dispatch "AGAIN" ;; | |
ent.Dispatch "SPECIAL" ;; | |
ent.Dispatch "SPECIAL" ;; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment