mirror of
https://github.com/erusev/parsedown.git
synced 2023-08-10 21:13:06 +03:00
Add configurable and state
This commit is contained in:
parent
7746c9df06
commit
1f06b47e6c
9
src/Configurable.php
Normal file
9
src/Configurable.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Erusev\Parsedown;
|
||||
|
||||
interface Configurable
|
||||
{
|
||||
/** @return static */
|
||||
public static function default();
|
||||
}
|
95
src/State.php
Normal file
95
src/State.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace Erusev\Parsedown;
|
||||
|
||||
use Erusev\Parsedown\AST\StateRenderable;
|
||||
use Erusev\Parsedown\Html\Renderable;
|
||||
|
||||
final class State
|
||||
{
|
||||
/**
|
||||
* @var array<class-string<Configurable>, Configurable>
|
||||
* */
|
||||
private $state;
|
||||
|
||||
/**
|
||||
* @param Configurable[] $Configurables
|
||||
*/
|
||||
public function __construct(array $Configurables = [])
|
||||
{
|
||||
$this->state = \array_combine(
|
||||
\array_map(
|
||||
/** @return class-string */
|
||||
function (Configurable $C) { return \get_class($C); },
|
||||
$Configurables
|
||||
),
|
||||
$Configurables
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return self
|
||||
*/
|
||||
public function setting(Configurable $C)
|
||||
{
|
||||
return new self([\get_class($C) => $C] + $this->state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return self
|
||||
*/
|
||||
public function mergingWith(State $State)
|
||||
{
|
||||
return new self($State->state + $this->state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @template T as Configurable
|
||||
* @template-typeof T $configurableClass
|
||||
* @param class-string<Configurable> $configurableClass
|
||||
* @return T|null
|
||||
* */
|
||||
public function get($configurableClass)
|
||||
{
|
||||
return (isset($this->state[$configurableClass])
|
||||
? $this->state[$configurableClass]
|
||||
: null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @template T as Configurable
|
||||
* @template-typeof T $configurableClass
|
||||
* @param class-string<Configurable> $configurableClass
|
||||
* @return T
|
||||
* */
|
||||
public function getOrDefault($configurableClass)
|
||||
{
|
||||
return (isset($this->state[$configurableClass])
|
||||
? $this->state[$configurableClass]
|
||||
: $configurableClass::default()
|
||||
);
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
$this->state = \array_map(
|
||||
/** @return Configurable */
|
||||
function (Configurable $C) { return clone($C); },
|
||||
$this->state
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param StateRenderable[] $StateRenderables
|
||||
* @return Renderable[]
|
||||
*/
|
||||
public function applyTo(array $StateRenderables)
|
||||
{
|
||||
return \array_map(
|
||||
/** @return Renderable */
|
||||
function (StateRenderable $SR) { return $SR->renderable($this); },
|
||||
$StateRenderables
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user