36 people like it.
Like the snippet!
Create Disposable
This pattern is helpful when you want to do something temporarily and then restore some state. This was inspired by the System.Disposable.Disposable() class defined in System.Core.dll distributed by the Reactive Extensions for .NET (Rx) library.
1:
2:
3:
4:
5:
6:
|
open System
let createDisposable f =
{
new IDisposable with
member x.Dispose() = f()
}
|
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
let changeColor color () =
let current = Console.ForegroundColor
Console.ForegroundColor <- color
createDisposable (fun () -> Console.ForegroundColor <- current)
let red = changeColor ConsoleColor.Red
let green = changeColor ConsoleColor.Green
using (red()) (fun _ -> printfn "This is red : %A" [1 .. 3])
using (green()) (fun _ -> printfn "This is %A : %A" ConsoleColor.Green [1 .. 3])
|
namespace System
val createDisposable : f:(unit -> unit) -> IDisposable
Full name: Script.createDisposable
val f : (unit -> unit)
type IDisposable =
member Dispose : unit -> unit
Full name: System.IDisposable
val x : IDisposable
IDisposable.Dispose() : unit
val changeColor : color:ConsoleColor -> unit -> IDisposable
Full name: Script.changeColor
val color : ConsoleColor
val current : ConsoleColor
type Console =
static member BackgroundColor : ConsoleColor with get, set
static member Beep : unit -> unit + 1 overload
static member BufferHeight : int with get, set
static member BufferWidth : int with get, set
static member CapsLock : bool
static member Clear : unit -> unit
static member CursorLeft : int with get, set
static member CursorSize : int with get, set
static member CursorTop : int with get, set
static member CursorVisible : bool with get, set
...
Full name: System.Console
property Console.ForegroundColor: ConsoleColor
val red : (unit -> IDisposable)
Full name: Script.red
type ConsoleColor =
| Black = 0
| DarkBlue = 1
| DarkGreen = 2
| DarkCyan = 3
| DarkRed = 4
| DarkMagenta = 5
| DarkYellow = 6
| Gray = 7
| DarkGray = 8
| Blue = 9
...
Full name: System.ConsoleColor
field ConsoleColor.Red = 12
val green : (unit -> IDisposable)
Full name: Script.green
field ConsoleColor.Green = 10
val using : resource:'T -> action:('T -> 'U) -> 'U (requires 'T :> IDisposable)
Full name: Microsoft.FSharp.Core.Operators.using
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
More information