anchor.diff:          let rec internal clone node =
               { Depth = node.Depth
                 Bounds = node.Bounds
  -              Children = Array.map clone node.Children
  -              // NOTE: it is inefficient to shallow-clone a HashSet like this, but sadly, .NET does not provide a proper
  -              // Clone method! #ARGH!
  -              Elements = HashSet (node.Elements, HashIdentity.Structural) }
  +              Children =
  +                match node.Children with
  +                | Right elements -> Right (HashSet (elements, HashIdentity.Structural))
  +                | Left nodes -> Left (Array.map clone nodes) }
   
           let rec internal make<'e when 'e : equality> granularity depth (bounds : Vector4) =
               if granularity < 2 then failwith "Invalid granularity for SpatialNode. Expected value of at least 2."
               if depth < 1 then failwith "Invalid depth for SpatialNode. Expected value of at least 1."
               let children =
  -                if depth > 1 then 
  -                    [|for i in 0 .. granularity * granularity - 1 do
  -                        let childDepth = depth - 1
  -                        let childSize = Vector2 (bounds.Z - bounds.X, bounds.W - bounds.Y) / single granularity
  -                        let childPosition = bounds.Xy + Vector2 (childSize.X * single (i % granularity), childSize.Y * single (i / granularity))
  -                        let childBounds = Vector4 (childPosition.X, childPosition.Y, childPosition.X + childSize.X, childPosition.Y + childSize.Y)
  -                        yield make<'e> granularity childDepth childBounds|]
  -                else [||]
  +                if depth > 1 then
  +                    let (nodes : 'e SpatialNode array) =
  +                        [|for i in 0 .. granularity * granularity - 1 do
  +                            let childDepth = depth - 1
  +                            let childSize = Vector2 (bounds.Z - bounds.X, bounds.W - bounds.Y) / single granularity
  +                            let childPosition = bounds.Xy + Vector2 (childSize.X * single (i % granularity), childSize.Y * single (i / granularity))
  +                            let childBounds = Vector4 (childPosition.X, childPosition.Y, childPosition.X + childSize.X, childPosition.Y + childSize.Y)
  +                            yield make granularity childDepth childBounds|]
  +                    Left nodes
  +                else Right (HashSet<'e> HashIdentity.Structural)
               { Depth = depth
                 Bounds = bounds
  -              Children = (children : 'e SpatialNode array)
  -              Elements = HashSet HashIdentity.Structural }
  +              Children = children }
   
   [<AutoOpen>]
   module SpatialTreeModule =
  
positive.code:     [<RequireQualifiedAccess>]
      module SpatialTree =
      
          let addElement omnipresence bounds element tree =
              if omnipresence then 
                  tree.OmnipresentElements.Add element |> ignore
              elif not ^ SpatialNode.inBounds bounds tree.Node then
                  Log.info "Element is outside of spatial tree's containment area or is being added redundantly."
                  tree.OmnipresentElements.Add element |> ignore
              else SpatialNode.addElement bounds element tree.Node
  
          let removeElement omnipresence bounds element tree =
              if omnipresence then 
                  tree.OmnipresentElements.Remove element |> ignore
              elif not ^ SpatialNode.inBounds bounds tree.Node then
                  Log.info "Element is outside of spatial tree's containment area or is not present for removal."
                  tree.OmnipresentElements.Remove element |> ignore
              else SpatialNode.removeElement bounds element tree.Node
      
          let updateElement
              oldOmnipresence oldBounds
              newOmnipresence newBounds
              element tree =
              // OPTIMIZATION: only update when element is not omnipresent
              if oldOmnipresence && newOmnipresence then
                  // TODO: P1: OPTIMIZATION: only update when element is computed to have changed nodes
                  removeElement oldOmnipresence oldBounds element tree
                  addElement newOmnipresence newBounds element tree
  
          let getElementsAtPoint point tree =
              let list = List tree.OmnipresentElements
              SpatialNode.getElementsAtPoint point tree.Node list
              list
      
          let getElementsInBounds bounds tree =
              let list = List tree.OmnipresentElements
              SpatialNode.getElementsInBounds bounds tree.Node list
              list
      
          let getDepth tree =
              SpatialNode.getDepth tree.Node
  
negative.code:         private
              { Depth : int
                Bounds : Vector4
                Children : Either<'e SpatialNode array, 'e HashSet> }
  
      [<RequireQualifiedAccess>]
      module internal SpatialNode =
  