anchor.diff:  
   type DocumentHandlerSet<'TKey, 'TDocument> = seq<('TKey * seq<DocumentHandler<'TDocument>>)>
   
  +type SubscriberEvent<'TContext> = {
  +    Event : obj
  +    Context : 'TContext
  +    StreamId : string
  +    EventNumber: int
  +}
  +
   [<CustomComparison>]
   [<CustomEquality>]
  -type DocumentProcessor<'TKey, 'TDocument> = {
  +type DocumentProcessor<'TKey, 'TDocument, 'TContext> = {
       ProcessorKey : string
       GetDocumentKey : 'TKey -> string
       EventTypes : seq<Type>
  -    Match: (obj -> DocumentHandlerSet<'TKey,'TDocument>)
  +    MatchingKeys: SubscriberEvent<'TContext> -> seq<'TKey>
  +    Process: 'TKey -> 'TDocument -> SubscriberEvent<'TContext> -> 'TDocument
       NewDocument : 'TKey -> 'TDocument
   }
   with
  -    override x.Equals(y) = (match y with :? DocumentProcessor<'TKey, 'TDocument> as y -> x.ProcessorKey = y.ProcessorKey | _ -> false)
  +    override x.Equals(y) = (match y with :? DocumentProcessor<'TKey, 'TDocument, 'TContext> as y -> x.ProcessorKey = y.ProcessorKey | _ -> false)
       override x.GetHashCode() = x.ProcessorKey.GetHashCode()
       interface System.IComparable with 
  -        member x.CompareTo y = x.ProcessorKey.CompareTo (y :?> DocumentProcessor<'TKey, 'TDocument>).ProcessorKey
  +        member x.CompareTo y = x.ProcessorKey.CompareTo (y :?> DocumentProcessor<'TKey, 'TDocument, 'TContext>).ProcessorKey
   
   //with 
   //    static member ToUntypedDocumentProcessor (x:DocumentProcessor<'TKey, 'TDocument>) =
  
positive.code:         do! loop ()
      }
  
      let grouper (key, value) =
          processors
          |> Seq.collect (fun x -> 
              let matches = x.Match((key,value) :> obj) |> Seq.isEmpty |> not
              if matches then
                  (key, x) |> Seq.singleton
              else
                  Seq.empty)
          |> Set.ofSeq
  
      let queue = new WorktrackingQueue<(Guid * DocumentProcessor<Guid,CurrentDoc>), Guid * int>(grouper, processEvent, 10000, 10);
  
      member x.Enqueue key value =
         queue.Add (key,value)
     
      member x.WaitAll = queue.AsyncComplete
  
  
negative.code:         let complete  = fun success -> async { tcs.SetResult(success) }
          (complete, Async.AwaitTask tcs.Task)
          
      let tryEvent (key : Guid, documentProcessor : DocumentProcessor<Guid,CurrentDoc, 'TEventContext>) events =
          async { 
              let docKey = documentProcessor.GetDocumentKey(key)
              
  