Skip to content

Instantly share code, notes, and snippets.

@rikmeijer
Created March 28, 2019 13:22
Show Gist options
  • Save rikmeijer/7099915c7bc7508b5e6dcb04470dbf71 to your computer and use it in GitHub Desktop.
Save rikmeijer/7099915c7bc7508b5e6dcb04470dbf71 to your computer and use it in GitHub Desktop.
Functional console IO
<?php
function console() : Closure {
$prompt = function(string $line) : Closure {
$genericDefault = function(string $default = null) {
return function(string $answer) use ($default) {
if (empty($answer)) {
return $default;
} else {
return $answer;
}
};
};
return function(Closure $default = null) use ($genericDefault, $line) {
if ($default === null) {
$default = $genericDefault(null);
}
$defaultValueFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . md5($line);
if (file_exists($defaultValueFile)) {
$default = $genericDefault(file_get_contents($defaultValueFile));
}
print ($default('') ? ' [' . $default('') . ']' : '') . ': ';
while (true) {
$answer = $default(Seld\CliPrompt\CliPrompt::prompt());
if ($answer !== null) {
file_put_contents($defaultValueFile, $answer);
break;
}
print '↳ ';
}
return $answer;
};
};
return function(string $line, bool $new_line = true) use ($prompt) : Closure {
print ($new_line ? PHP_EOL : '') . $line;
return $prompt($line);
};
}
@rikmeijer
Copy link
Author

rikmeijer commented Mar 28, 2019

$answer = console("Please enter your name")(function(string $answer) {
    if (empty($answer)) {
        return null;
    }
    return $answer;
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment