anchor.diff:      member this.Reset() = this.Reset()
       member this.MoveNext(): bool =
         if started then
  -        if this.InputCursor.MoveNext() && this.InputCursor.Comparer.Compare(this.InputCursor.CurrentKey, last) <= 0 then
  +        if this.InputCursor.MoveNext() && endOk this.InputCursor.CurrentKey then
             true
           else false
         else (this :> ICursor<'K,'V>).MoveFirst()
  
positive.code:   let cursor = cursorFactory.Invoke()
    let mutable started = false
      
  
    // EQ just means inclusive
    let firstLookup = if startLookup.IsSome && startLookup.Value <> Lookup.EQ then startLookup.Value else Lookup.GE
    let lastLookup = if endLookup.IsSome && endLookup.Value <> Lookup.EQ then endLookup.Value else Lookup.LE
  
    let hasFirst, first = 
      if startKey.IsSome then
        let moved = cursor.MoveAt(startKey.Value, firstLookup)
        if moved then true, cursor.CurrentKey else false, Unchecked.defaultof<_>
      else
        let moved =  cursor.MoveFirst()
        if moved then true, cursor.CurrentKey else false, Unchecked.defaultof<_>
      
    let hasLast, last = 
      if endKey.IsSome then
        let moved = cursor.MoveAt(endKey.Value, lastLookup)
        if moved then true, cursor.CurrentKey else false, Unchecked.defaultof<_>
      else
        let moved =  cursor.MoveLast()
        if moved then true, cursor.CurrentKey else false, Unchecked.defaultof<_>
  
    let mutable hasValues = hasFirst && hasLast && cursor.Comparer.Compare(first, last) <= 0
  
    let inRange k = cursor.Comparer.Compare(k, first) >= 0 && cursor.Comparer.Compare(k, last) <= 0
  
    do
      cursor.Reset()
  
negative.code: open Spreads.Collections
  
  
  /// Range from start to end key. 
  //[<DebuggerTypeProxy(typeof<SeriesDebuggerProxy<_,_>>)>]
  type RangeCursor<'K,'V>(cursorFactory:Func<ICursor<'K,'V>>, startKey:'K option, endKey:'K option, startLookup: Lookup option, endLookup:Lookup option) =
  