208 lines
5 KiB
PHP
208 lines
5 KiB
PHP
<?php
|
|
|
|
namespace alveolata\storage;
|
|
|
|
// require_once(DIR_ALVEOLATA . '/definitions.php');
|
|
require_once(DIR_ALVEOLATA . '/list/functions.php');
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
class struct_wrapper/*<type_key_inner,type_value_inner,type_key_outer,type_value_outer>*/
|
|
{
|
|
|
|
/**
|
|
* @var \Closure {function<type_key_out,type_key_in>}
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $convert_key_in;
|
|
|
|
|
|
/**
|
|
* @var \Closure {function<type_key_in,type_key_out>}
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $convert_key_out;
|
|
|
|
|
|
/**
|
|
* @var \Closure {function<type_value_out,type_value_in>}
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $convert_value_in;
|
|
|
|
|
|
/**
|
|
* @var \Closure {function<type_value_in,type_value_out>}
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $convert_value_out;
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public function __construct(
|
|
\Closure $core_setup,
|
|
\Closure $core_teardown,
|
|
\Closure $core_create,
|
|
\Closure $core_update,
|
|
\Closure $core_delete,
|
|
\Closure $core_read,
|
|
\Closure $core_search,
|
|
\Closure $convert_key_in,
|
|
\Closure $convert_key_out,
|
|
\Closure $convert_value_in,
|
|
\Closure $convert_value_out
|
|
)
|
|
{
|
|
$this->core_setup = $core_setup;
|
|
$this->core_teardown = $core_teardown;
|
|
$this->core_create = $core_create;
|
|
$this->core_update = $core_update;
|
|
$this->core_delete = $core_delete;
|
|
$this->core_read = $core_read;
|
|
$this->core_search = $core_search;
|
|
$this->convert_key_in = $convert_key_in;
|
|
$this->convert_key_out = $convert_key_out;
|
|
$this->convert_value_in = $convert_value_in;
|
|
$this->convert_value_out = $convert_value_out;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_make/*<type_key_inner,type_value_inner,type_key_outer,type_value_outer>*/(
|
|
\Closure $core_setup,
|
|
\Closure $core_teardown,
|
|
\Closure $core_create,
|
|
\Closure $core_update,
|
|
\Closure $core_delete,
|
|
\Closure $core_read,
|
|
\Closure $core_search,
|
|
\Closure $convert_key_in,
|
|
\Closure $convert_key_out,
|
|
\Closure $convert_value_in,
|
|
\Closure $convert_value_out
|
|
) : struct_wrapper/*<type_key_inner,type_value_inner,type_key_outer,type_value_outer>*/
|
|
{
|
|
return (
|
|
new struct_wrapper/*<type_key_inner,type_value_inner,type_key_outer,type_value_outer>*/(
|
|
$core_setup,
|
|
$core_teardown,
|
|
$core_create,
|
|
$core_update,
|
|
$core_delete,
|
|
$core_read,
|
|
$core_search,
|
|
$convert_key_in,
|
|
$convert_key_out,
|
|
$convert_value_in,
|
|
$convert_value_out
|
|
)
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_teardown/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject
|
|
) : void
|
|
{
|
|
($subject->core_teardown)();
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_setup(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject
|
|
) : void
|
|
{
|
|
($subject->core_setup)();
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_create(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject,
|
|
/*type_value_outer */$value_outer
|
|
)/* : type_key_outer*/
|
|
{
|
|
$value_inner = ($subject->convert_value_in)($value_outer);
|
|
$key_inner = ($subject->core_create)($value_inner);
|
|
$key_outer = ($subject->convert_key_out)($key_inner);
|
|
return $key_outer;
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_update(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject,
|
|
/*type_key_outer */$key_outer,
|
|
/*type_value_outer */$value_outer
|
|
) : void
|
|
{
|
|
$key_inner = ($subject->convert_key_in)($key_outer);
|
|
$value_inner = ($subject->convert_value_in)($value_outer);
|
|
($subject->core_update)($key_inner, $value_inner);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_delete(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject,
|
|
/*type_key_outer */$key_outer
|
|
) : void
|
|
{
|
|
($subject->core_delete)($key_outer);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_read(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject,
|
|
/*type_key_outer */$key_outer
|
|
)/* : type_value_outer*/
|
|
{
|
|
$key_inner = ($subject->convert_key_in)($key_outer);
|
|
$value_inner = ($subject->core_read)($key_inner);
|
|
$value_outer = ($subject->convert_value_out)($value_inner);
|
|
return $value_outer;
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function wrapper_search(
|
|
struct_wrapper/*<type_key_inner, type_key_outer, type_value_inner, type_value_outer>*/ $subject,
|
|
array $parameters = []
|
|
) : array
|
|
{
|
|
$keys_inner = ($subject->core_search)($parameters);
|
|
$keys_outer = \alveolata\list_\map/*<type_key_inner, type_key_outer>*/(
|
|
$keys_inner,
|
|
function (/*type_key_inner */$key_inner)/* : type_key_outer*/ use ($subject) {
|
|
return ($subject->convert_key_out)($key_inner);
|
|
}
|
|
);
|
|
return $keys_outer;
|
|
}
|
|
|
|
?>
|