anchor.diff:          exn         = fun n e d -> runTwoAsyncs (first.exn n e d) (second.exn n e d)
           summary     = fun config summary -> runTwoAsyncs (first.summary config summary) (second.summary config summary)
         }
  -
  -  // C# is weak and can't really handle Async or partial application
  -  and ITestPrinter =
  -    abstract member BeforeRun   : Test -> Task
  -    abstract member BeforeEach  : string -> Task
  -    abstract member Info        : string -> Task
  -    abstract member Passed      : string * TimeSpan -> Task
  -    abstract member Ignored     : string * string -> Task
  -    abstract member Failed      : string * string * TimeSpan -> Task
  -    abstract member Exn         : string * exn * TimeSpan -> Task
  -    abstract member Summary     : ExpectoConfig * TestRunSummary -> Task
       
     // Runner options
     and ExpectoConfig =
  
positive.code:       /// Allows duplicate test names.
        allowDuplicateNames: bool
      }
      // C# is weak and it is hard to update the configuration
      member x.WithParallel(parallel) = { x with parallel = parallel }
      member x.WithParallelWorkers(parallelWorkers) = { x with parallelWorkers = parallelWorkers }
      member x.WithStress(stress) = { x with stress = stress }
      member x.WithStressTimeout(stressTimeout) = { x with stressTimeout = stressTimeout }
      member x.WithStressMemoryLimit(stressMemoryLimit) = { x with stressMemoryLimit = stressMemoryLimit }
      member x.WithFilter(filter) = { x with filter = filter }
      member x.WithFailOnFocusedTests(failOnFocusedTests) = { x with failOnFocusedTests = failOnFocusedTests }
      member x.WithPrinter(printer) = { x with printer = printer }
      /// Set the printer - this replaces the current one
      member x.WithPrinter(printer:ITestPrinter) = { x with printer = TestPrinters.fromInterface printer }
      /// Add an additional printer - this does not replace the current one
      member x.AddPrinter(printer:ITestPrinter) =
        let combinedPrinter = TestPrinters.mergePrinters (x.printer, (TestPrinters.fromInterface printer))
        { x with printer = combinedPrinter }
      member x.WithVerbosity(verbosity) = { x with verbosity = verbosity }
      member x.WithLogName(logName) = { x with logName = logName }
      member x.WithLocate(locate) = { x with locate = locate }
      member x.WithFsCheckMaxTests(fsCheckMaxTests) = { x with fsCheckMaxTests = fsCheckMaxTests }
      member x.WithFsCheckStartSize(fsCheckStartSize) = { x with fsCheckStartSize = fsCheckStartSize }
      member x.WithFsCheckEndSize(fsCheckEndSize) = { x with fsCheckEndSize = fsCheckEndSize }
      member x.WithMySpiritIsWeak(mySpiritIsWeak) = { x with mySpiritIsWeak = mySpiritIsWeak }
      member x.WithAllowDuplicateNames(allowDuplicateNames) = { x with allowDuplicateNames = allowDuplicateNames }
      static member defaultConfig =
        { parallel = true
          parallelWorkers = Environment.ProcessorCount
  
negative.code:           do! innerPrinter.summary c s
            tcLog "testSuiteFinished" [
              "name", "ExpectoTestSuite" ] } }
      static member mergePrinters (first:TestPrinters, second:TestPrinters) =
        let runTwoAsyncs a b = async {
          do! a
  