anchor.diff:  
       // Manual state machine instead of a task computation expression, this is visibly faster
       let doMoveNextDiscreteTask(ct:CancellationToken) : Task<bool> =
  +      #if PRERELEASE
  +      Trace.Assert(this.HasValidState)
  +      #endif
         let mutable tcs = Runtime.CompilerServices.AsyncTaskMethodBuilder<bool>.Create() //new TaskCompletionSource<_>() //
         let returnTask = tcs.Task // NB! must access this property first
         let mutable firstStep = ref true
  
positive.code:         if c.Value.MoveLast() then c.Value.Current else invalidOp "Series is empty"
  
      member this.TryFind(k:'K, direction:Lookup, [<Out>] result: byref<KeyValuePair<'K, 'V>>) = 
        if c.Value.MoveAt(k, direction) then 
          result <- c.Value.Current 
          true
        else false
  
negative.code: 
          if not moved then continueMoves <- false
          // must add it back regardless of moves
          // TODO (perf) should benefit here from RemoveFirstAddLast method, becuase is moved = true, 
          // we add the last value by construction
          discreteKeysSet.Add(KV(ac.CurrentKey, first.Value)) |> ignore
  
        // now all discrete cursors have moved at or ahead of frontier
  