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

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

        }
    }()
    
    /// Send current value immediately and send both updates and actions
    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))
