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

    }
}

extension ObservableCollection where UnderlyingCollection: Equatable {
    public static func == (lhs: ObservableCollection<UnderlyingCollection>, rhs: ObservableCollection<UnderlyingCollection>) -> Bool {
        return lhs.collection == rhs.collection
    }
}

public class MutableObservableCollection<UnderlyingCollection: MutableCollection & DataSourceProtocol>: ObservableCollection<UnderlyingCollection> {
    public override subscript(index: UnderlyingCollection.Index) -> UnderlyingCollection.Element {
        get {
            return collection[index]

    }
}

extension ObservableCollectionChange where Index == Int {
    public var asDataSourceEventKind: DataSourceEventKind {
        switch self {
        case .reset:
