Async implementation of innmind/stream
to allow switching to another task when reading, writing or watching for streams.
composer require innmind/async-stream
use Innmind\Async\Stream\Streams;
use Innmind\Stream\Streams as Synchronous;
use Innmind\TimeContinuum\Earth\Clock;
use Innmind\Url\Path;
use Innmind\Mantle\{
Source\Predetermined,
Suspend,
Forerunner,
};
$clock = new Clock;
$synchronous = Synchronous::fromAmbientAuthority();
$source = Predetermined::of(
static function(Suspend $suspend) use ($clock, $synchronous) {
$stream = Streams::of($synchronous, $suspend, $clock)
->readable()
->open(Path::of('fixtures/first.txt'));
while (!$stream->end()) {
echo $stream->readLine()->match(
static fn($line) => $line->toString(),
static fn() => '',
);
}
},
static function(Suspend $suspend) use ($clock, $synchronous) {
$stream = Streams::of($synchronous, $suspend, $clock)
->readable()
->open(Path::of('fixtures/second.txt'));
while (!$stream->end()) {
echo $stream->readLine()->match(
static fn($line) => $line->toString(),
static fn() => '',
);
}
},
);
Forerunner::of($clock)(null, $source); // will print interlaced lines of both files