 public final class ObservableArray<Element> {
     public typealias DidInsert = (Element, _ at: Int) -> ()
     public typealias DidRemove = (Element, _ at: Int) -> ()
+    public typealias DidUpdate = (Element, _ at: Int) -> ()
     public typealias DidRemoveAll = (_ oldValues: [Element]) -> ()
     public typealias DidMove = (Element, _ from: Int, _ to: Int) -> ()
-    public typealias ObservationHandlers = (insert: DidInsert?, remove: DidRemove?, removeAll: DidRemoveAll?, didMove: DidMove?)
+    public typealias ObservationHandlers = (insert: DidInsert?, update: DidUpdate?, remove: DidRemove?, removeAll: DidRemoveAll?, didMove: DidMove?)
 
     fileprivate var observers: [(observer: WeakWrapper<AnyObject>, handlers: [ObservationHandlers])] = []
     fileprivate var onHasObserversChanged: ((Bool) -> ())?


        self.remove(at: index)
    }
}

private extension ObservableArray {

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

    public func replace(elementAt index: Int, with element: Element) {
        self.values[index] = element
        self.executeWithAllHandlers({ handler in
            handler.update?(element, index)
        })
    }

