 
 // These two operators make the direction of data flow clearer.
 
+@discardableResult
 public func <+ <Value, UpdateInfo, ActionInfo>(property: ViewModelProperty<Value, UpdateInfo, ActionInfo>, valueAndInfo: (Value, UpdateInfo)) -> Value {
     return property.setValueByUpdate(valueAndInfo.0, info: valueAndInfo.1)
 }
 
+@discardableResult
 public func +> <Value, UpdateInfo, ActionInfo>(valueAndInfo: (Value, ActionInfo), property: ViewModelProperty<Value, UpdateInfo, ActionInfo>) -> Value {
     return property.setValueByAction(valueAndInfo.0, info: valueAndInfo.1)
 }
 
+@discardableResult
 public func <+ <Value, UpdateInfo: NoInfoType, ActionInfo>(property: ViewModelProperty<Value, UpdateInfo, ActionInfo>, value: Value) -> Value {
     return property.setValueByUpdate(value, info: UpdateInfo())
 }
 
+@discardableResult
 public func +> <Value, UpdateInfo, ActionInfo: NoInfoType>(value: Value, property: ViewModelProperty<Value, UpdateInfo, ActionInfo>) -> Value {
     return property.setValueByAction(value, info: ActionInfo())
 }

    
    // MARK: -
    
    public private(set) lazy var changingProducer: SignalProducer<Value, NoError> = { [unowned self] () -> SignalProducer<Value, NoError> in
        return SignalProducer<Value, NoError> { observer, producerDisposable in
            self.updateProducer.startWithSignal { signal, cancelDisposable in
                producerDisposable += cancelDisposable

                signal.observe { event in
                    switch event {
                    case .next(let valueAndInfo):
                        observer.sendNext(valueAndInfo.0)
                    case .failed, .interrupted: // no possible
                        break
                    case .completed:
                        observer.sendCompleted()
                    }
                    
                }
            }
            
            producerDisposable += self.actionSignal.observeNext { valueAndInfo in
                observer.sendNext(valueAndInfo.0)
            }
        }
    }()
    
    private let lock: NSRecursiveLock
    private var _value: Value
    

    }
    
    /// Set the value by user action, e.g. user edit a text field. Returns the old value.
    @discardableResult
    public func setValueByAction(_ newValue: Value, info: ActionInfo) -> Value {
        lock.lock()
        defer { lock.unlock() }
