Skip to content

Instantly share code, notes, and snippets.

@cloudRoutine
Created October 19, 2015 00:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cloudRoutine/885d02af0b05b944c52f to your computer and use it in GitHub Desktop.
Save cloudRoutine/885d02af0b05b944c52f to your computer and use it in GitHub Desktop.
Components and Events
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