path = $path; $this->id_encode = $id_encode; $this->id_decode = $id_decode; } private function get() : array { $content = (\file_exists($this->path) ? \file_get_contents($this->path) : null); return ( ($content === null) ? ['last_id' => 0, 'entries' => []] : \json_decode($content, true) ); } private function put(array $data) : void { $content = \json_encode($data, \JSON_PRETTY_PRINT); \file_put_contents($this->path, $content); } public function list_() : array { $data = $this->get(); return \array_map( fn ($id_encoded) => [ 'id' => ($this->id_decode)($id_encoded), 'value' => $data['entries'][$id_encoded], ], \array_keys($data['entries']) ); } public function read(int $id) { $data = $this->get(); $id_encoded = ($this->id_encode)($id); if (! \array_key_exists($id_encoded, $data['entries'])) { throw (new \Exception('not found')); } else { return $data['entries'][$id_encoded]; } } public function create($value) : int { $data = $this->get(); $id = ($data['last_id'] + 1); $id_encoded = ($this->id_encode)($id); $data['last_id'] = $id; $data['entries'][$id_encoded] = $value; $this->put($data); return $id; } public function update(int $id, $value) : void { $data = $this->get(); $id_encoded = ($this->id_encode)($id); if (! \array_key_exists($id_encoded, $data['entries'])) { throw (new \Exception('not found')); } else { $data['entries'][$id_encoded] = $value; $this->put($data); } } public function delete(int $id) : void { $data = $this->get(); $id_encoded = ($this->id_encode)($id); if (! \array_key_exists($id_encoded, $data['entries'])) { throw (new \Exception('not found')); } else { unset($data['entries'][$id_encoded]); $this->put($data); } } } ?>