--- /dev/null
+<?php
+
+/*
+ * This file is part of Psy Shell.
+ *
+ * (c) 2012-2018 Justin Hileman
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Psy\Readline;
+
+use Psy\Exception\BreakException;
+
+/**
+ * An array-based Readline emulation implementation.
+ */
+class Transient implements Readline
+{
+ private $history;
+ private $historySize;
+ private $eraseDups;
+ private $stdin;
+
+ /**
+ * Transient Readline is always supported.
+ *
+ * {@inheritdoc}
+ */
+ public static function isSupported()
+ {
+ return true;
+ }
+
+ /**
+ * Transient Readline constructor.
+ */
+ public function __construct($historyFile = null, $historySize = 0, $eraseDups = false)
+ {
+ // don't do anything with the history file...
+ $this->history = [];
+ $this->historySize = $historySize;
+ $this->eraseDups = $eraseDups;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addHistory($line)
+ {
+ if ($this->eraseDups) {
+ if (($key = array_search($line, $this->history)) !== false) {
+ unset($this->history[$key]);
+ }
+ }
+
+ $this->history[] = $line;
+
+ if ($this->historySize > 0) {
+ $histsize = count($this->history);
+ if ($histsize > $this->historySize) {
+ $this->history = array_slice($this->history, $histsize - $this->historySize);
+ }
+ }
+
+ $this->history = array_values($this->history);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clearHistory()
+ {
+ $this->history = [];
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function listHistory()
+ {
+ return $this->history;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function readHistory()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @throws BreakException if user hits Ctrl+D
+ *
+ * @return string
+ */
+ public function readline($prompt = null)
+ {
+ echo $prompt;
+
+ return rtrim(fgets($this->getStdin(), 1024));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function redisplay()
+ {
+ // noop
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function writeHistory()
+ {
+ return true;
+ }
+
+ /**
+ * Get a STDIN file handle.
+ *
+ * @throws BreakException if user hits Ctrl+D
+ *
+ * @return resource
+ */
+ private function getStdin()
+ {
+ if (!isset($this->stdin)) {
+ $this->stdin = fopen('php://stdin', 'r');
+ }
+
+ if (feof($this->stdin)) {
+ throw new BreakException('Ctrl+D');
+ }
+
+ return $this->stdin;
+ }
+}