Skip to content

Instantly share code, notes, and snippets.

@vasily-kirichenko
Created November 19, 2021 14:00
Show Gist options
  • Save vasily-kirichenko/37c2a5e34c39c005aede0d1e4f66d4ea to your computer and use it in GitHub Desktop.
Save vasily-kirichenko/37c2a5e34c39c005aede0d1e4f66d4ea to your computer and use it in GitHub Desktop.
[<AutoOpen>]
module StringBuffer =
open System.Text
type StringBuffer = StringBuilder -> unit
type StringBufferBuilder () =
member inline _.Yield (txt: string) = fun (b: StringBuilder) -> b.Append txt |> ignore
member inline _.Yield (c: char) = fun (b: StringBuilder) -> b.Append c |> ignore
member inline _.Yield (strings: #seq<string>) =
fun (b: StringBuilder) -> for s in strings do s |> b.AppendLine |> ignore
member inline _.YieldFrom (f: StringBuffer) = f
member inline _.Combine (f, g) = fun (b: StringBuilder) -> f b; g b
member inline _.Delay f = fun (b: StringBuilder) -> (f()) b
member inline _.Zero () = ignore
member inline _.For (xs: 'a seq, f: 'a -> StringBuffer) =
fun (b: StringBuilder) ->
let e = xs.GetEnumerator ()
while e.MoveNext() do
(f e.Current) b
member inline _.While (p: unit -> bool, f: StringBuffer) =
fun (b: StringBuilder) -> while p () do f b
member inline _.Run (f: StringBuffer) =
let b = StringBuilder()
do f b
b.ToString()
let stringBuffer = new StringBufferBuilder ()
let _ = stringBuffer {
yield sprintf "%d" 1 // тут ок
}
let _ = stringBuffer {
sprintf "%d" 1 // тут нет хинта и экшена
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment