0 people like it.
Like the snippet!
Pimpl
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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
|
type IGameScreenVirtuals =
abstract Update : unit -> string
type IGameScreen =
abstract Prop : string
abstract Virtuals : IGameScreenVirtuals
let createGameScreenBase () =
let prop = ref "GameScreen.Prop"
(fun virtuals ->
{ new IGameScreen with
member o.Prop = !prop
member o.Virtuals = virtuals }), fun p -> prop := p
let createLoadingScreen () =
let createBase, setProp = createGameScreenBase ()
setProp "LoadingScreen.Prop"
createBase
{ new IGameScreenVirtuals with
member o.Update() = "LoadingScreen.Update" }
type IMenuScreenVirtuals =
abstract OnCancel : unit -> string
type IMenuScreen =
abstract GameScreen : IGameScreen
abstract Virtuals : IMenuScreenVirtuals
let createMenuScreenBase () =
let createGameBase, setProp = createGameScreenBase ()
setProp "MenuScreen.Prop"
(fun gameMethods ->
{ new IMenuScreen with
member o.GameScreen = createGameBase gameMethods
member o.Virtuals =
{ new IMenuScreenVirtuals with
member o.OnCancel() = "MenuScreen.OnCancel" } }), setProp
let createPauseMenuScreen () =
let createMenuBase, setProp = createMenuScreenBase ()
setProp "PauseMenuScreen.Prop"
createMenuBase
{ new IGameScreenVirtuals with
member o.Update() = "pauseMenuScreen.Update" }
module Example =
let gameScreens : IGameScreen[] = [| createLoadingScreen (); (createPauseMenuScreen ()).GameScreen|]
let testGameScreens (screens : IGameScreen[]) =
for gs in screens do
gs.Prop |> printfn "%s"
gs.Virtuals.Update () |> printfn "%s"
testGameScreens gameScreens
let menuScreens : IMenuScreen[] = [| createPauseMenuScreen () |]
let testMenuScreens (screens: IMenuScreen[]) =
for ms in screens do
ms.GameScreen.Prop |> printfn "%s"
ms.GameScreen.Virtuals.Update () |> printfn "%s"
ms.Virtuals.OnCancel () |> printfn "%s"
testMenuScreens menuScreens
|
abstract member IGameScreenVirtuals.Update : unit -> string
Full name: Script.IGameScreenVirtuals.Update
type unit = Unit
Full name: Microsoft.FSharp.Core.unit
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 IGameScreen =
interface
abstract member Prop : string
abstract member Virtuals : IGameScreenVirtuals
end
Full name: Script.IGameScreen
abstract member IGameScreen.Prop : string
Full name: Script.IGameScreen.Prop
abstract member IGameScreen.Virtuals : IGameScreenVirtuals
Full name: Script.IGameScreen.Virtuals
type IGameScreenVirtuals =
interface
abstract member Update : unit -> string
end
Full name: Script.IGameScreenVirtuals
val createGameScreenBase : unit -> (IGameScreenVirtuals -> IGameScreen) * (string -> unit)
Full name: Script.createGameScreenBase
val prop : string ref
Multiple items
val ref : value:'T -> 'T ref
Full name: Microsoft.FSharp.Core.Operators.ref
--------------------
type 'T ref = Ref<'T>
Full name: Microsoft.FSharp.Core.ref<_>
val virtuals : IGameScreenVirtuals
val o : IGameScreen
property IGameScreen.Prop: string
property IGameScreen.Virtuals: IGameScreenVirtuals
val p : string
val createLoadingScreen : unit -> IGameScreen
Full name: Script.createLoadingScreen
val createBase : (IGameScreenVirtuals -> IGameScreen)
val setProp : (string -> unit)
val o : IGameScreenVirtuals
abstract member IGameScreenVirtuals.Update : unit -> string
type IMenuScreenVirtuals =
interface
abstract member OnCancel : unit -> string
end
Full name: Script.IMenuScreenVirtuals
abstract member IMenuScreenVirtuals.OnCancel : unit -> string
Full name: Script.IMenuScreenVirtuals.OnCancel
type IMenuScreen =
interface
abstract member GameScreen : IGameScreen
abstract member Virtuals : IMenuScreenVirtuals
end
Full name: Script.IMenuScreen
abstract member IMenuScreen.GameScreen : IGameScreen
Full name: Script.IMenuScreen.GameScreen
abstract member IMenuScreen.Virtuals : IMenuScreenVirtuals
Full name: Script.IMenuScreen.Virtuals
val createMenuScreenBase : unit -> (#IGameScreenVirtuals -> IMenuScreen) * (string -> unit)
Full name: Script.createMenuScreenBase
val createGameBase : (IGameScreenVirtuals -> IGameScreen)
val gameMethods : #IGameScreenVirtuals
val o : IMenuScreen
property IMenuScreen.GameScreen: IGameScreen
property IMenuScreen.Virtuals: IMenuScreenVirtuals
val o : IMenuScreenVirtuals
abstract member IMenuScreenVirtuals.OnCancel : unit -> string
val createPauseMenuScreen : unit -> IMenuScreen
Full name: Script.createPauseMenuScreen
val createMenuBase : (IGameScreenVirtuals -> IMenuScreen)
module Example
from Script
val gameScreens : IGameScreen []
Full name: Script.Example.gameScreens
val testGameScreens : screens:IGameScreen [] -> unit
Full name: Script.Example.testGameScreens
val screens : IGameScreen []
val gs : IGameScreen
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val menuScreens : IMenuScreen []
Full name: Script.Example.menuScreens
val testMenuScreens : screens:IMenuScreen [] -> unit
Full name: Script.Example.testMenuScreens
val screens : IMenuScreen []
val ms : IMenuScreen
More information