0 people like it.

funscript

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
// define in engine
type ICritter =
        abstract member DoTalk : ICritter*string -> unit
        abstract member Talk : Event<string> with get

//
type Npc(name) =
    let talk = new Event<string>()
    interface ICritter with
        member self.DoTalk(other, phrase) =
            printfn "%s says '%s' to %s"  name phrase "some other npc"
            other.Talk.Trigger(phrase)
        member self.Talk with get() = talk
    override self.ToString() = name

// in script engine
type Action =
    | Talk of ICritter*ICritter*string

let mutable actions = List.empty

let talk (phrase: string) (npc: ICritter) (player: ICritter) handler =
    actions <- Talk(player, npc, phrase) :: actions
    npc.Talk.Publish
    |> Event.filter (fun s -> s = phrase)
    |> Event.add handler

// then, in script
let player = Npc("player")
let npc = Npc("ginger")

player |> talk "Hello" npc
<| fun s ->
    printfn "handler!"
abstract member ICritter.DoTalk : ICritter * string -> unit

Full name: Script.ICritter.DoTalk
type ICritter =
  interface
    abstract member DoTalk : ICritter * string -> unit
    abstract member Talk : Event<string>
  end

Full name: Script.ICritter
Multiple items
val string : value:'T -> string

Full name: Microsoft.FSharp.Core.Operators.string

--------------------
type string = System.String

Full name: Microsoft.FSharp.Core.string
type unit = Unit

Full name: Microsoft.FSharp.Core.unit
abstract member ICritter.Talk : Event<string>

Full name: Script.ICritter.Talk
Multiple items
module Event

from Microsoft.FSharp.Control

--------------------
type Event<'T> =
  new : unit -> Event<'T>
  member Trigger : arg:'T -> unit
  member Publish : IEvent<'T>

Full name: Microsoft.FSharp.Control.Event<_>

--------------------
type Event<'Delegate,'Args (requires delegate and 'Delegate :> Delegate)> =
  new : unit -> Event<'Delegate,'Args>
  member Trigger : sender:obj * args:'Args -> unit
  member Publish : IEvent<'Delegate,'Args>

Full name: Microsoft.FSharp.Control.Event<_,_>

--------------------
new : unit -> Event<'T>

--------------------
new : unit -> Event<'Delegate,'Args>
Multiple items
type Npc =
  interface ICritter
  new : name:string -> Npc
  override ToString : unit -> string

Full name: Script.Npc

--------------------
new : name:string -> Npc
val name : string
val talk : Event<string>
val self : Npc
override Npc.DoTalk : other:ICritter * phrase:string -> unit

Full name: Script.Npc.DoTalk
val other : ICritter
val phrase : string
val printfn : format:Printf.TextWriterFormat<'T> -> 'T

Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
property ICritter.Talk: Event<string>
member Event.Trigger : arg:'T -> unit
override Npc.Talk : Event<string>

Full name: Script.Npc.Talk
override Npc.ToString : unit -> string

Full name: Script.Npc.ToString
type Action = | Talk of ICritter * ICritter * string

Full name: Script.Action
union case Action.Talk: ICritter * ICritter * string -> Action
val mutable actions : Action list

Full name: Script.actions
Multiple items
module List

from Microsoft.FSharp.Collections

--------------------
type List<'T> =
  | ( [] )
  | ( :: ) of Head: 'T * Tail: 'T list
  interface IEnumerable
  interface IEnumerable<'T>
  member Head : 'T
  member IsEmpty : bool
  member Item : index:int -> 'T with get
  member Length : int
  member Tail : 'T list
  static member Cons : head:'T * tail:'T list -> 'T list
  static member Empty : 'T list

Full name: Microsoft.FSharp.Collections.List<_>
val empty<'T> : 'T list

Full name: Microsoft.FSharp.Collections.List.empty
val talk : phrase:string -> npc:ICritter -> player:ICritter -> handler:(string -> unit) -> unit

Full name: Script.talk
val npc : ICritter
val player : ICritter
val handler : (string -> unit)
property Event.Publish: IEvent<string>
val filter : predicate:('T -> bool) -> sourceEvent:IEvent<'Del,'T> -> IEvent<'T> (requires delegate and 'Del :> System.Delegate)

Full name: Microsoft.FSharp.Control.Event.filter
val s : string
val add : callback:('T -> unit) -> sourceEvent:IEvent<'Del,'T> -> unit (requires delegate and 'Del :> System.Delegate)

Full name: Microsoft.FSharp.Control.Event.add
val player : Npc

Full name: Script.player
val npc : Npc

Full name: Script.npc
Raw view Test code New version

More information

Link:http://fssnip.net/5v
Posted:15 years ago
Author:
Tags: