 
         self.remove(at: index)
     }
+
+    public func replace(where passes: (Element) throws -> Bool, with element: Element) rethrows {
+        guard let index = try self.values.index(where: passes) else {
+            return
+        }
+
+        self.replace(elementAt: index, with: element)
+    }
+
+    public func insert(_ element: Element, after passing: (Element) throws -> Bool) rethrows {
+        let index = try self.values.index(where: passing) ?? self.values.count - 1
+        self.insert(element, at: index + 1)
+    }
 }
 
 private extension ObservableArray {

        self.values.insert(element, at: index)
        self.executeWithAllHandlers({ handler in
            handler.insert?(element, index)
        })
    }


    public func add(
        observer: AnyObject,
        onDidInsert: DidInsert? = nil,
        onDidUpdate: DidUpdate? = nil,
        onDidRemove: DidRemove? = nil,
        onDidRemoveAll: DidRemoveAll? = nil,
        onDidMove: DidMove? = nil
        )
    {
        guard onDidInsert != nil || onDidRemove != nil || onDidMove != nil || onDidRemoveAll != nil else {
            return
        }

        let handlers: ObservationHandlers = (
            insert: onDidInsert,
            update: onDidUpdate,
            remove: onDidRemove,
            removeAll: onDidRemoveAll,
            didMove: onDidMove
