item($id); if ($data === null) { return null; } $result = clone $this->result; $result->data = $data; return new Preference(fn () => $result); } /** * The value of a key, or $default when it isn't set. */ public function get(string $key, mixed $default = null): mixed { $data = $this->item($key); return $data !== null ? $data->value : $default; } public function has(string $key): bool { return $this->item($key) !== null; } /** * The values by key. * * @return array */ public function values(): array { $values = []; foreach ((array) $this->result->data as $data) { $values[$data->key] = $data->value; } return $values; } private function item(string $key): ?object { foreach ((array) $this->result->data as $data) { if (($data->key ?? null) === $key) { return $data; } } return null; } }