     }
     
     /// Set the value by program update such as network callback. Returns the old value.
+    @discardableResult
     public func setValueByUpdate(_ newValue: Value, info: UpdateInfo) -> Value {
         lock.lock()
         defer { lock.unlock() }


// These two operators make the direction of data flow clearer.

public func <+ <Value, UpdateInfo, ActionInfo>(property: ViewModelProperty<Value, UpdateInfo, ActionInfo>, valueAndInfo: (Value, UpdateInfo)) -> Value {
    return property.setValueByUpdate(valueAndInfo.0, info: valueAndInfo.1)
}

public func +> <Value, UpdateInfo, ActionInfo>(valueAndInfo: (Value, ActionInfo), property: ViewModelProperty<Value, UpdateInfo, ActionInfo>) -> Value {
    return property.setValueByAction(valueAndInfo.0, info: valueAndInfo.1)
}

public func <+ <Value, UpdateInfo: NoInfoType, ActionInfo>(property: ViewModelProperty<Value, UpdateInfo, ActionInfo>, value: Value) -> Value {
    return property.setValueByUpdate(value, info: UpdateInfo())
}

public func +> <Value, UpdateInfo, ActionInfo: NoInfoType>(value: Value, property: ViewModelProperty<Value, UpdateInfo, ActionInfo>) -> Value {
    return property.setValueByAction(value, info: ActionInfo())
}

    
    // MARK: -
    
    private let lock: NSRecursiveLock
    private var _value: Value
    
