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

    }
}

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

}

fileprivate extension ObservableCollectionChange {
    fileprivate func unwrap<C: Collection>(using list: C) -> [ObservableCollectionChange] where C.Index == Index {
        func deletionsPatch(_ indices: [Index]) -> [Index] {
            var indices = indices
            for i in 0..<indices.count {
                let pivot = indices[i]
