*/ { /** */ private string $path; /** */ private \Closure $id_encode; /** */ private \Closure $id_decode; /** */ public function __construct( string $path, \Closure $id_encode, \Closure $id_decode ) { $this->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 setup() : void { // do nothing } /** */ 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($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) { $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($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($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); } } } ?>