anchor.diff:  type FileLoadingPermanentTestAssembly(notifier: Notifier, file: FileInfo) =
     inherit PermanentTestAssembly()
   
  +  let disposables =
  +    new CompositeDisposable()
  +
  +  let cancelRequested =
  +    new Subject<_>()
  +
  +  let reloadRequested =
  +    new Subject<_>()
  +
  +  let tryLoad () =
  +    match OneshotTestAssembly.ofFile file with
  +    | Success testAssembly ->
  +      testAssembly |> Some
  +    | Failure e ->
  +      notifier.NotifyWarning
  +        ( sprintf "Couldn't load an assembly '%s'." file.Name
  +        , [| ("Exception", e :> obj) |]
  +        )
  +      None
  +
     let currentTestAssembly =
  -    ReactiveProperty.create (None: option<OneshotTestAssembly>)
  +    reloadRequested
  +    |> Observable.map tryLoad
  +    |> Observable.merge (cancelRequested |> Observable.map (fun () -> None))
  +    |> ReactiveProperty.ofObservable None
  +
  +  let testAssemblyTrash =
  +    let trash = new SerialDisposable()
  +    currentTestAssembly |> Observable.subscribe
  +      (fun testAssembly ->
  +        trash.Disposable <-
  +          match testAssembly with
  +          | Some testAssembly -> testAssembly :> IDisposable
  +          | None -> Disposable.Empty
  +      ) |> ignore
  +    disposables.Add(trash)
  +    trash
   
     let cancel () =
  -    match currentTestAssembly.Value with
  -    | Some testAssembly ->
  -      testAssembly.Dispose()
  -      currentTestAssembly.Value <- None
  -    | None -> ()
  +    cancelRequested.OnNext(())
   
     let cancelCommand =
       currentTestAssembly
  
positive.code:       )
      |> Observable.switch
  
    let subscription =
      new SingleAssignmentDisposable()
  
    let load () =
      cancel ()
      match OneshotTestAssembly.ofFile file with
      | Success testAssembly ->
        currentTestAssembly.Value <- Some testAssembly
        testAssembly.Start()
      | Failure e ->
        notifier.NotifyWarning
          ( sprintf "Couldn't load an assembly '%s'." file.Name
          , [| ("Exception", e :> obj) |]
          )
  
    let start () =
      load ()
      subscription.Disposable <-
        file |> FileInfo.subscribeChanged (TimeSpan.FromMilliseconds(100.0)) load
  
    override this.CancelCommand =
      cancelCommand
  
negative.code:     start ()
  
    override this.Dispose() =
      disposables.Dispose()
  