<?xml version="1.0" encoding="UTF-8"?>
-<phpunit
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"
- backupGlobals="true"
- backupStaticAttributes="false"
- cacheTokens="false"
- colors="false"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- forceCoversAnnotation="false"
- mapTestClassNameToCoveredClassName="false"
- processIsolation="false"
- stopOnError="false"
- stopOnFailure="false"
- stopOnIncomplete="false"
- stopOnSkipped="false"
- timeoutForSmallTests="1"
- timeoutForMediumTests="10"
- timeoutForLargeTests="60"
- verbose="false">
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.3/phpunit.xsd">
<testsuites>
<testsuite name="Functional">
<directory>./test/Functional</directory>
<testsuite name="Primitive">
<directory>./test/Primitive</directory>
</testsuite>
+ <testsuite name="Useful">
+ <directory>./test/Useful</directory>
+ </testsuite>
<testsuite name="Examples">
<directory>./example/</directory>
</testsuite>
use Widmogrod\Primitive\Listt;
use Widmogrod\Primitive\ListtCons;
use Widmogrod\Primitive\ListtNil;
-use function Widmogrod\Useful\match;
/**
* @var callable
*
* cycle ties a finite list into a circular one, or equivalently, the infinite repetition of the original list. It is the identity on infinite lists.
*
- * @param Listt $l
+ * @param Listt $xs
* @return Listt
* @throws EmptyListError
*/
-function cycle(Listt $l): Listt
+function cycle(Listt $xs): Listt
{
- if ($l instanceof ListtNil) {
+ if ($xs instanceof ListtNil) {
throw new EmptyListError(__FUNCTION__);
}
- $cycle = match([
- ListtNil::class => function () use (&$next) {
- return $next;
- },
- ListtCons::class => identity
- ]);
+ $cycle = function (Listt $xs, Listt $cycled) use (&$cycle) : Listt {
+ if ($cycled instanceof ListtNil) {
+ return cycle($xs);
+ }
- $next = ListtCons::of(function () use ($l, $cycle) {
- return [head($l), $cycle(tail($l))];
- });
+ return ListtCons::of(function () use ($xs, $cycled, $cycle) {
+ return [head($cycled), $cycle($xs, tail($cycled))];
+ });
+ };
- return $next;
+ return $cycle($xs, $xs);
}
{
return curryN(2, function ($a) {
return $a;
- });
+ })(...func_get_args());
}
Generator\int(),
Generator\int()
)->then(function ($a, $b) {
- return constt($a, $b) === $a
- && constt($a)($b) === $a;
+ $this->assertEquals($a, constt($a, $b));
+ $this->assertEquals($a, constt($a)($b));
});
}
}
use Eris\Generator;
use Eris\TestTrait;
-use function Widmogrod\Functional\eql;
-use function Widmogrod\Functional\filter;
-use function Widmogrod\Functional\foldr;
use const Widmogrod\Functional\identity;
use function Widmogrod\Functional\cycle;
+use function Widmogrod\Functional\fromIterable;
use function Widmogrod\Functional\iterate;
use function Widmogrod\Functional\length;
use function Widmogrod\Functional\take;
public function test_it_should_generate_infinite_list()
{
$this->forAll(
- Generator\choose(1, 100),
+ Generator\choose(2, 100),
Generator\int()
)->then(function ($n, $value) {
$list = cycle(take($n, iterate(identity, $value)));
$list = take($n * 2, $list);
- return length($list) === $n * 2;
+ $this->assertEquals($n * 2, length($list));
});
}
- public function test_it_should_generate_repetive_value()
+ public function test_it_should_generate_repetitive_value()
{
- $this->forAll(
- Generator\choose(1, 100),
- Generator\int()
- )->then(function ($n, $value) {
- $addOne = function (int $i): int {
- return $i + 1;
- };
+ $list = cycle(fromIterable(['a', 1]));
+ $list = take(4, $list);
- $list = cycle(take($n, iterate($addOne, $value)));
- $list = take($n * 2, $list);
-
- return length(filter(eql($value), $list)) === $n
- && ($value + $n) * 2 === foldr(identity, $list);
- });
+ $this->assertEquals(
+ ['a', 1, 'a', 1],
+ $list->extract()
+ );
}
}
use Eris\Generator;
use Eris\TestTrait;
-use function Widmogrod\Functional\eql;
-use function Widmogrod\Functional\filter;
-use function Widmogrod\Functional\foldr;
use const Widmogrod\Functional\identity;
use function Widmogrod\Functional\iterate;
use function Widmogrod\Functional\length;
+use function Widmogrod\Functional\reduce;
use function Widmogrod\Functional\take;
class IterateTest extends \PHPUnit\Framework\TestCase
public function test_it_should_generate_infinite_list()
{
$this->forAll(
- Generator\choose(1, 100),
+ Generator\choose(5, 100),
Generator\int()
)->then(function ($n, $value) {
$list = take($n, iterate(identity, $value));
- return length($list) === $n;
+ $this->assertEquals($n, length($list));
});
}
public function test_it_should_generate_repetive_value()
{
$this->forAll(
- Generator\choose(1, 100),
+ Generator\choose(5, 100),
Generator\int()
)->then(function ($n, $value) {
$addOne = function (int $i): int {
$list = take($n, iterate($addOne, $value));
- return length(filter(eql($value), $list)) === $n
- && $value + $n === foldr(identity, $list);
+ $this->assertEquals(
+ $value + $n - 1,
+ reduce(function ($agg, $i) {
+ return $i;
+ }, 0, $list)
+ );
});
}
}
)->then(function ($n, $value) {
$list = take($n, repeat($value));
- return length($list) === $n;
+ $this->assertEquals($n, length($list));
});
}
)->then(function ($n, $value) {
$list = take($n, repeat($value));
- return length(filter(eql($value), $list)) === $n;
+ return $this->assertEquals($n, length(filter(eql($value), $list)));
});
}
}
)->then(function ($n, $value) {
$list = replicate($n, $value);
- return length($list) === $n;
+ $this->assertEquals($n, length($list));
});
}
)->then(function ($n, $value) {
$list = replicate($n, $value);
- return length(filter(eql($value), $list)) === $n;
+ $this->assertEquals($n, length(filter(eql($value), $list)));
});
}
}
)->then(function ($n, $x, $y) {
[$xs, $ys] = unzip(repeat([$x, $y]));
- return length(filter(eql($x), take($n, $xs))) === $n
- && length(filter(eql($y), take($n, $ys))) === $n;
+ $this->assertEquals($n, length(filter(eql($x), take($n, $xs))));
+ $this->assertEquals($n, length(filter(eql($y), take($n, $ys))));
});
}
}
)->then(function ($n, $a, $b) {
$list = take($n, zip(repeat($a), repeat($b)));
- return length(filter(eql([$a, $b]), $list)) === $n;
+ $this->assertEquals($n, length(filter(eql([$a, $b]), $list)));
});
}
}
$value,
$expectedMessage
) {
- $this->setExpectedException(PatternNotMatchedError::class, $expectedMessage);
+ $this->expectException(PatternNotMatchedError::class);
+ $this->expectExceptionMessage($expectedMessage);
match($patterns, $value);
}