anchor.diff:          | TreeDoc e ->
               let after = elt.InsertBefore(JS.Document.CreateTextNode "", elt.FirstChild)
               let before = Docs.InsertBeforeDelim after doc.DocNode
  -            e.Holes.JS.Push {
  +            this.AddHole {
                   El = elt
                   Attr = Attrs.Empty elt
                   Children = doc.DocNode
                   Delimiters = Some (before, after)
                   ElKey = Fresh.Int()
                   Render = None
  -            } |> ignore
  +            }
           | _ -> failwith "Invalid docNode in Elt"
           rvUpdates.Value <- View.Map2Unit rvUpdates.Value doc.Updates
   
  
positive.code:             e.Children <- EmptyDoc
          | TreeDoc e ->
              e.Els <- [||]
              e.Holes <- [||]
          | _ -> failwith "Invalid docNode in Elt"
          rvUpdates.Value <- View.Const()
          elt.TextContent <- v
  
negative.code:         View.Map2Unit updates (holeUpdates.View |> View.BindInner (Array.map snd >> Array.TreeReduce (View.Const ()) View.Map2Unit)),
          elt, rvUpdates)
  
      let mutable origHoles = treeNode.Holes
  
      override this.AddHole h =
          origHoles.JS.Push h |> ignore
          treeNode.Holes <- Array.append treeNode.Holes [| h |]
  
      override this.ClearHoles() =
          origHoles <- [||]
          treeNode.Holes <- [||]
          holeUpdates.Value <- [||]
  
      member this.AddUpdated(doc: Elt) =
          let d = As<Elt'> doc
          match d.DocNode with
          | ElemDoc e ->
              treeNode.Holes <- Array.append treeNode.Holes [| e |]
              let hu = holeUpdates.Value
              hu.JS.Push ((e.ElKey, d.Updates)) |> ignore
              holeUpdates.Value <- hu
  