     public typealias DidInsert = (Element, at: Int) -> ()
     public typealias DidRemove = (Element, at: Int) -> ()
     public typealias DidRemoveAll = (oldValues: [Element]) -> ()
-    public typealias ObservationHandlers = (insert: DidInsert?, remove: DidRemove?, removeAll: DidRemoveAll?)
+    public typealias DidMove = (Element, from: Int, to: Int) -> ()
+    public typealias ObservationHandlers = (insert: DidInsert?, remove: DidRemove?, removeAll: DidRemoveAll?, didMove: DidMove?)
 
     private var observers: [(observer: WeakWrapper, handlers: [ObservationHandlers])] = []
     private var onHasObserversChanged: ((Bool) -> ())?
+    private var isOrderedBefore: ((lhs: Element, rhs: Element) -> Bool)?
 
     public private(set) var values: [Element]
 

        observer observer: AnyObject,
        onDidInsert: DidInsert? = nil,
        onDidRemove: DidRemove? = nil,
        onDidRemoveAll: DidRemoveAll? = nil
        )
    {
        guard onDidInsert != nil || onDidRemove != nil || onDidRemoveAll != nil else {
            return
        }

        let handlers: ObservationHandlers = (insert: onDidInsert, remove: onDidRemove, removeAll: onDidRemoveAll)
        if let index = self.index(ofObserver: observer) {
            self.observers[index].handlers.append(handlers)
        }

        self.init([])
    }

    public init(
        _ values: [Element],
        enforceOrder isOrderedBefore: ((lhs: Element, rhs: Element) -> Bool)? = nil,
        onHasObserversChanged: ((Bool) -> ())? = nil
        )
    {
        self.values = values
        self.isOrderedBefore = isOrderedBefore
        self.onHasObserversChanged = onHasObserversChanged
    }

