/// A keyvalue interface that provides atomic operations.
/// 
/// Atomic operations are single, indivisible operations. When a fault causes
/// an atomic operation to fail, it will appear to the invoker of the atomic
/// operation that the action either completed successfully or did nothing
/// at all.
interface atomic {
	/// A keyvalue interface that provides atomic operations.
	use types.{bucket, error, key};

	/// Atomically increment the value associated with the key in the bucket by the 
	/// given delta. It returns the new value.
	///
	/// If the key does not exist in the bucket, it creates a new key-value pair
	/// with the value set to the given delta. 
	///
	/// If any other error occurs, it returns an `Err(error)`.
	increment: func(bucket: borrow<bucket>, key: key, delta: u64) -> result<u64, error>;
	
	/// Compare-and-swap (CAS) atomically updates the value associated with the key
	/// in the bucket if the value matches the old value. This operation returns
	/// `Ok(true)` if the swap was successful, `Ok(false)` if the value did not match,
	/// 
	/// A successful CAS operation means the current value matched the `old` value
	/// and was replaced with the `new` value.
	///
	/// If the key does not exist in the bucket, it returns `Ok(false)`.
	/// 
	/// If any other error occurs, it returns an `Err(error)`.
	compare-and-swap: func(bucket: borrow<bucket>, key: key, old: u64, new: u64) -> result<bool, error>;
}