anchor.diff:      // manual state machine instead of a task computation expression, this is visibly faster
       // But this is complex, TODO review, run benchmarks 
       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:               // move to max key until min key matches max key so that we can use values
                valuesOk <- doMoveNextDiscrete()
                doContinue <- valuesOk
        if valuesOk then 
          this.HasValidState <- true
          true
        else false
  
  
      member this.MoveLast(): bool = 
  
negative.code: 
      // TODO (perf) no attempts was made to optimize the async version
      let doMoveNextContinuousTask(frontier:'K, ct:CancellationToken) : Task<bool> =
        #if PRERELEASE
        Trace.Assert(this.HasValidState)
        #endif
        task {
        let mutable frontier = frontier
  
  