anchor.diff:              // all the segments we just committed can now be removed from
               // the segments in waiting list
               lock critSectionSegmentsInWaiting (fun () ->
  -                let remainingSegmentsInWaiting = Map.filter (fun g _ -> Map.containsKey g newGuidsAsMap |> not) segmentsInWaiting
  +                let remainingSegmentsInWaiting = Map.filter (fun g _ -> Set.contains g newGuidsAsSet |> not) segmentsInWaiting
                   segmentsInWaiting <- remainingSegmentsInWaiting
               )
   
  
positive.code: 
      interface ITransaction with
          member this.Commit(newGuids:seq<Guid>) =
              let newGuidsAsMap = Seq.fold (fun acc g -> Map.add g () acc) Map.empty newGuids
              let mySegmentsInWaiting = Map.filter (fun g _ -> Map.containsKey g newGuidsAsMap) segmentsInWaiting
              lock critSectionHeader (fun () -> 
                  let newState = (List.ofSeq newGuids) @ header.currentState
                  let newSegments = Map.fold (fun acc key value -> Map.add key value acc) header.segments mySegmentsInWaiting
                  let newSill = saveSegmentInfoList newSegments
                  let newHeader = {header with sill = newSill; currentState=newState;}
                  writeHeader newHeader
                  // TODO the old location of the segment info list is now free pages
                  header <- newHeader
              )
              // no need for lock critSectionInTransaction here because there is
  
negative.code:         let fs = io.OpenForReading()
          let hook (csr:ICursor) =
              fs.Close()
              // TODO remove csr from cursors list.  which means we need
              // a way to get the guid for a cursor.
          let csr = BTreeSegment.OpenCursor(fs, pageSize, rootPage, new Action<ICursor>(hook))
          lock critSectionCursors (fun () -> cursors <- (g,csr) :: cursors; )
          csr
  