anchor.diff:              e.Children <- EmptyDoc
           | TreeDoc e ->
               e.Els <- [||]
  -            e.Holes <- [||]
  +            this.ClearHoles()
           | _ -> failwith "Invalid docNode in Elt"
           rvUpdates.Value <- View.Const()
           elt.TextContent <- v
  
positive.code:         | TreeDoc e ->
              let after = elt.InsertBefore(JS.Document.CreateTextNode "", elt.FirstChild)
              let before = Docs.InsertBeforeDelim after doc.DocNode
              e.Holes.JS.Push {
                  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
  
  
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
  