 
 // 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())
 }

        }
    }()
    
    public private(set) lazy var allChangeProducer: SignalProducer<(Value, CurrentOrUpdateOrAction<UpdateInfo, ActionInfo>), NoError> = { [unowned self] in
        return SignalProducer { observer, producerDisposable in
            observer.sendNext((self._value, .current))

    
    // MARK: - Derived signals
    
    /// Like updateSignal but send current value immediately
    public private(set) lazy var updateProducer: SignalProducer<(Value, CurrentOrUpdate<UpdateInfo>), NoError> = { [unowned self] in
        return SignalProducer { observer, producerDisposable in
            observer.sendNext((self._value, .current))
