setListener( new Event\Listener( $this, [ 'new', 'modify', 'move' ] ) ); if (null !== $latency) { $this->setLatency($latency); } return; } /** * Run the watcher. * * Listenable events: * • new, when a file is new, i.e. found by the finder; * • modify, when a file has been modified; * • move, when a file has moved, i.e. no longer found by the finder. * * @return void */ public function run() { $iterator = $this->getIterator(); $previous = iterator_to_array($iterator); $current = $previous; while (true) { foreach ($current as $name => $c) { if (!isset($previous[$name])) { $this->getListener()->fire( 'new', new Event\Bucket([ 'file' => $c ]) ); continue; } if (null === $c->getHash()) { unset($current[$name]); continue; } if ($previous[$name]->getHash() != $c->getHash()) { $this->getListener()->fire( 'modify', new Event\Bucket([ 'file' => $c ]) ); } unset($previous[$name]); } foreach ($previous as $p) { $this->getListener()->fire( 'move', new Event\Bucket([ 'file' => $p ]) ); } usleep($this->getLatency() * 1000000); $previous = $current; $current = iterator_to_array($iterator); } return; } /** * Set latency. * * @param int $latency Latency (in seconds). * @return int */ public function setLatency($latency) { $old = $this->_latency; $this->_latency = $latency; return $old; } /** * Get latency. * * @return int */ public function getLatency() { return $this->_latency; } }