     }
 }
 
-extension ObservableCollectionEvent: DataSourceEventProtocol {
+extension ObservableCollectionEvent: DataSourceEventProtocol where UnderlyingCollection: DataSourceProtocol {
+
+    public typealias DataSource = UnderlyingCollection
     public typealias BatchKind = BatchKindDiff
 
     public var kind: DataSourceEventKind {


        // use proxy to collect changes
        let proxy = MutableObservableCollection(collection)
        var patch: [ObservableCollectionChange<UnderlyingCollection>] = []
        let disposable = proxy.skip(first: 1).observeNext { event in
            patch.append(event.change)
        }

    }
}

extension ObservableCollectionPatchEvent: DataSourceEventProtocol where UnderlyingCollection: DataSourceProtocol {

    public typealias DataSource = UnderlyingCollection
    public typealias BatchKind = BatchKindPatch

    public var kind: DataSourceEventKind {
