Skip to content

Instantly share code, notes, and snippets.

@krauthaufen
Created October 24, 2019 06:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krauthaufen/199ff3a620fbc820dcf2f2d2174bdce5 to your computer and use it in GitHub Desktop.
Save krauthaufen/199ff3a620fbc820dcf2f2d2174bdce5 to your computer and use it in GitHub Desktop.
module Map =
let union (l : Map<'K, 'V>) (r : Map<'K, 'V>) =
(l, r) ||> Map.fold (fun l k v -> Map.add k v l)
type Node = Node of Map<string, string> * list<Node>
type SubNodeBuilder(attributes : Map<string, string>) =
member x.Zero() = []
member x.Yield(node : Node) = [node]
member x.Combine(l, r) = l @ r()
member x.Delay f = f
member x.Run f = Node(attributes, f())
type NodeBuilder() =
member x.Zero() = Map.empty
member x.Yield(name : string, value : string) = Map.ofList [name, value]
member x.Combine(l, r) = Map.union l (r())
member x.Delay f = f
member x.Run f = SubNodeBuilder(f())
type LeafBuilder() =
member x.Zero() = Map.empty
member x.Yield(name : string, value : string) = Map.ofList [name, value]
member x.Combine(l, r) = Map.union l (r())
member x.Delay f = f
member x.Run f = Node(f(), [])
let node = NodeBuilder()
let leaf = LeafBuilder()
let test =
(node { "a", "somevalue" }) {
leaf { "b", "foo" }
leaf { "b", "foo" }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment