anchor.diff:        task { 
           if started then
             let! moved = this.InputCursor.MoveNext(cancellationToken) 
  -          if moved && this.InputCursor.Comparer.Compare(this.InputCursor.CurrentKey, last) <= 0 then
  +          if moved &&  endOk this.InputCursor.CurrentKey then
               return true
             else return false
           else return (this :> ICursor<'K,'V>).MoveFirst()
  
positive.code:       else false
        
      member this.MoveFirst(): bool = 
        if hasValues && this.InputCursor.MoveAt(first, firstLookup) then
          started <- true
          true
        else false
      
      member this.MoveLast(): bool = 
        if hasValues && this.InputCursor.MoveAt(last, lastLookup) then
          started <- true
          true
        else false
  
      member this.MovePrevious(): bool = 
        if started then
          if this.InputCursor.MovePrevious() && this.InputCursor.Comparer.Compare(this.InputCursor.CurrentKey, first) >= 0 then
            true
          else false
        else (this :> ICursor<'K,'V>).MoveLast()
  
negative.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
  
    // if limits are not set then eny key is ok
    let startOk k = 
      if startKey.IsSome then cursor.Comparer.Compare(k, startKey.Value) >= 0
      else true
    let endOk k = 
      if endKey.IsSome then cursor.Comparer.Compare(k, endKey.Value) <= 0
      else true
    let inRange k = (startOk k) && (endOk k)
  
    do
      cursor.Reset()
  