 	}
 }
 
-public extension Observable where Element: Placeholder & Equatable {
+public extension Observable where Element: Placeholder {
 
     public func mapToOperation() -> Observable<Viewpoint<Element>.Operation> {
         return map { (value: Element) -> Viewpoint<Element>.Operation  in
             return { _ in value }
         }
     }
+
+    public func update(using operation: Observable<Viewpoint<Element>.Operation>) -> Observable<Element> {
+        return Observable<Viewpoint<Element>.Operation>.merge(operation, mapToOperation()).scan(Element.placeholder) { $1($0) }
+    }
 }

	/// The object graph argument can be omitted only when the viewpoint is passed to `run(...)`.
    public init(_ value: Observable<T>, objectGraph: ObjectGraph? = nil) {
		self.objectGraph = objectGraph ?? ObjectGraph()
        self.value = Observable.merge(operation, value.mapToOperation()).scan(T.placeholder) { $1($0) }
	}

	// MARK: - Generating Item Representation

import Foundation
import RxSwift

open class Viewpoint<T: Placeholder>: Presentation {

    // MARK: - Types

