         }
     }
 
+    public var futureValues: Source<[Element]> {
+        if let signal = _futureValues {
+            return signal.source
+        }
+        else {
+            let s = Signal<[Element]>()
+            _futureValues = s
+            return s.source
+        }
+    }
+
     public func setValue(value: [Element]) {
         let oldCount = _value.count
         _value = value
         _futureChanges?.send(ArrayChange(count: oldCount, modification: .ReplaceRange(0..<oldCount, with: value)))
+        _futureValues?.send(value)
     }
 
     public var count: Int {

    public func insert(newElement: Element, at index: Int) {
        value.insert(newElement, atIndex: index)
        _futureChanges?.send(ArrayChange(count: self.count - 1, modification: .Insert(newElement, at: index)))
    }

    public func removeAtIndex(index: Int) -> Element {
        let result = value.removeAtIndex(index)
        _futureChanges?.send(ArrayChange(count: self.count + 1, modification: .RemoveAt(index)))
        return result
    }

    public func removeFirst() -> Element {
        let result = value.removeFirst()
        _futureChanges?.send(ArrayChange(count: self.count + 1, modification: .RemoveAt(0)))
        return result
    }

    public func removeLast() -> Element {
        let result = value.removeLast()
        _futureChanges?.send(ArrayChange(count: self.count + 1, modification: .RemoveAt(self.count)))
        return result
    }
    
    public func popLast() -> Element? {
        guard let result = value.popLast() else { return nil }
        _futureChanges?.send(ArrayChange(count: self.count + 1, modification: .RemoveAt(self.count)))
        return result
    }


        let oldCount = count
        value.replaceRange(subRange, with: newElements)
        _futureChanges?.send(ArrayChange(count: oldCount, modification: .ReplaceRange(subRange, with: Array<Element>(newElements))))
        _futureValues?.send(value)
    }

    // These have default implementations in terms of replaceRange, but doing them by hand makes for better change reports.
