add method
Result<CacheEntry<K, V, U> , CachetteError>
add(
- K key,
- V value, {
- ConflictPolicy? conflictPolicy,
- U? user,
- Set<
U> ? users,
Adds a cache item with key
and value
.
Use conflictPolicy
to override the Cachette's conflict policy.
If user
or users
are provided, they will be added to the cache item.
Note that in order to use users, ConflictPolicy.users
must be used.
Try saying the previous sentence out loud quickly.
Implementation
Result<CacheEntry<K, V, U>, CachetteError> add(
K key,
V value, {
ConflictPolicy? conflictPolicy,
U? user,
Set<U>? users,
}) {
conflictPolicy ??= this.conflictPolicy;
if (_items.containsKey(key)) {
switch (conflictPolicy) {
case ConflictPolicy.overwrite:
case ConflictPolicy.users:
break;
case ConflictPolicy.error:
return Result.error(KeyConflictError(key));
case ConflictPolicy.exception:
throw CachetteException('Conflicting key: $key');
}
}
final cleanRes = clean(sizeLimit: size - 1);
if (!cleanRes.ok) {
return Result.error(cleanRes.error!);
}
if (user != null) {
users = {...?users, user};
}
_registry[key] = switch ((conflictPolicy, users)) {
(ConflictPolicy.users, null) => EntryInfo.create(key),
(ConflictPolicy.users, Set<U> users) =>
_registry[key]?.addUsers(users) ?? EntryInfo.create(key, users),
_ => EntryInfo.create(key, users),
};
_items[key] = value;
return Result.ok(CacheEntry.build(value, _registry[key]!));
}