Skip to content

Instantly share code, notes, and snippets.

@Tarmil
Last active February 4, 2022 09:53
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tarmil/afcf5f50e45e90200eb7b01615b0ffc0 to your computer and use it in GitHub Desktop.
Save Tarmil/afcf5f50e45e90200eb7b01615b0ffc0 to your computer and use it in GitHub Desktop.
type Attr = delegate of RenderTreeBuilder * int -> int
type Node = delegate of RenderTreeBuilder * int -> int
type NodeBuilder(name: string) =
static member Empty = Node(fun _sb x -> x)
member _.Name = name
member inline _.Yield([<InlineIfLambda>] n: Node) = n
member inline _.Yield([<InlineIfLambda>] n: Attr) = n
member inline this.Yield(b: NodeBuilder) =
Node(fun tb i ->
tb.OpenElement(i, b.Name)
tb.CloseElement()
i + 1)
member inline this.Run([<InlineIfLambda>] children: Node) : Node =
Node(fun tb i ->
tb.OpenElement(i, this.Name)
let j = children.Invoke(tb, i + 1)
tb.CloseElement()
j)
member inline _.Combine([<InlineIfLambda>] x1: Node, [<InlineIfLambda>] x2: Node) =
Node(fun sb i -> x2.Invoke(sb, x1.Invoke(sb, i)))
member inline _.Combine([<InlineIfLambda>] x1: Attr, [<InlineIfLambda>] x2: Attr) =
Node(fun sb i -> x2.Invoke(sb, x1.Invoke(sb, i)))
member inline _.Combine([<InlineIfLambda>] x1: Attr, [<InlineIfLambda>] x2: Node) =
Node(fun sb i -> x2.Invoke(sb, x1.Invoke(sb, i)))
member inline _.Delay([<InlineIfLambda>] n: unit -> Node) = n()
let inline elt name = NodeBuilder(name)
let inline text (s: string) : Node =
Node(fun tb i ->
tb.AddContent(i, s)
i + 1)
let inline (=>) (name: string) (value: 'a) =
Attr(fun tb i ->
tb.AddAttribute(i, name, box value)
i + 1)
module attr =
let inline id value = "id" => value
let inline href value = "href" => value
let div = NodeBuilder "div"
let span = NodeBuilder "span"
let a = NodeBuilder "a"
let d =
div {
text "Welcome to "
a {
attr.href "https://fsbolero.io"
attr.id "link"
text "Bolero"
}
text "!"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment