} */ public $listeners; /** * @array {map} */ public function __construct( array $listeners ) { $this->listeners = $listeners; } } /** * @return struct */ function make( ) : struct { return ( new struct([]) ); } /** * @param struct $subject * @param \Closure $procedure {function} */ function register( struct $subject, \Closure $procedure ) : string { $count = count($subject->listeners); $id = sprintf('listener_%d', $count); $subject->listeners[$id] = $procedure; return $id; } /** * @param struct $subject * @param mixed $data {any} */ function notify( struct $subject, $data )/* : void*/ { $result = []; foreach ($subject->listeners as $id => $procedure) { $result[$id] = $procedure($data); } return $result; } ?>