     }
 
     // MARK: Public methods
-
-    public func valuesWhere(predicate: String, prefilterChangeSet: (([TCollection.Value], ChangeSet<String>) -> Bool)? = nil) -> CollectionTypeObserver<[TCollection.Value]> {
-        let queryResultsObserver = CollectionTypeObserver<[TCollection.Value]>(initalValue: [])
-
-        let disposable =
-        collectionDidChange { (collection, changeSet) in
-            let canCheckPreviousValue = prefilterChangeSet != nil && queryResultsObserver.value.count > 0
-            let shouldRequery = canCheckPreviousValue ? prefilterChangeSet!(queryResultsObserver.value, changeSet) : true
-
-            if shouldRequery {
-                let queryResults = collection.findValuesWhere(predicate)
-                queryResultsObserver.setValue(queryResults, fromTransaction: collection.readTransaction)
-            }
-        }
-
-        queryResultsObserver.disposeBag.add(disposable)
-        // If disposing ancestors, dispose this collection and all its child observers by removing from ObservingConnection
-        queryResultsObserver.disposeBag.parent = self.disposeBag
-
-        return queryResultsObserver
-    }
 
     /**
      - returns: Disposable - call `dispose()` to remove the `didChange` callback.

public class ObservableCollection<TCollection: Collection where TCollection: IndexedCollection>: TypedObservable, TypeErasedObservableCollection {
    // MARK: Public properties
    public private(set) var value: ReadCollection<TCollection>?


    }
}

extension ObservableCollection where TCollection: IndexedCollection {
    // MARK: Public methods

    public func valuesWhere(predicate: String, prefilterChangeSet: (([TCollection.Value], ChangeSet<String>) -> Bool)? = nil) -> CollectionTypeObserver<[TCollection.Value]> {
        let queryResultsObserver = CollectionTypeObserver<[TCollection.Value]>(initalValue: [])

        let disposable =
        collectionDidChange { (collection, changeSet) in
            let canCheckPreviousValue = prefilterChangeSet != nil && queryResultsObserver.value.count > 0
            let shouldRequery = canCheckPreviousValue ? prefilterChangeSet!(queryResultsObserver.value, changeSet) : true

            if shouldRequery {
                let queryResults = collection.findValuesWhere(predicate)
                queryResultsObserver.setValue(queryResults, fromTransaction: collection.readTransaction)
            }
        }

        queryResultsObserver.disposeBag.add(disposable)
        // If disposing ancestors, dispose this collection and all its child observers by removing from ObservingConnection
        queryResultsObserver.disposeBag.parent = self.disposeBag

        return queryResultsObserver
    }
}

internal protocol TypeErasedObservableCollection {

}