Skip to content

Commit

Permalink
Merge bcfcac6 into fac0f15
Browse files Browse the repository at this point in the history
  • Loading branch information
azjezz committed Dec 16, 2022
2 parents fac0f15 + bcfcac6 commit 21d2c0a
Show file tree
Hide file tree
Showing 12 changed files with 582 additions and 11 deletions.
2 changes: 1 addition & 1 deletion docs/component/range.md
Expand Up @@ -25,7 +25,7 @@

#### `Classes`

- [BetweenRange](./../../src/Psl/Range/BetweenRange.php#L45)
- [BetweenRange](./../../src/Psl/Range/BetweenRange.php#L48)
- [FromRange](./../../src/Psl/Range/FromRange.php#L36)
- [FullRange](./../../src/Psl/Range/FullRange.php#L20)
- [ToRange](./../../src/Psl/Range/ToRange.php#L22)
Expand Down
121 changes: 118 additions & 3 deletions src/Psl/Range/BetweenRange.php
Expand Up @@ -36,8 +36,11 @@
* @implements UpperBoundRangeInterface<T>
*
* @see RangeInterface::contains()
* @see RangeInterface::withLowerBound()
* @see RangeInterface::withUpperBound()
* @see LowerBoundRangeInterface::getLowerBound()
* @see UpperBoundRangeInterface::getUpperBound()
* @see UpperBoundRangeInterface::withUpperInclusive()
* @see UpperBoundRangeInterface::isUpperInclusive()
*
* @immutable
Expand Down Expand Up @@ -80,13 +83,97 @@ public function contains(int|float $value): bool
/**
* {@inheritDoc}
*
* @return T
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function getLowerBound(): int|float
public function withUpperBound(float|int $upper_bound, bool $upper_inclusive): BetweenRange
{
return $this->lower_bound;
return new BetweenRange(
$this->lower_bound,
$upper_bound,
$upper_inclusive,
);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundInclusive(float|int $upper_bound): BetweenRange
{
return new BetweenRange(
$this->lower_bound,
$upper_bound,
true,
);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundExclusive(float|int $upper_bound): BetweenRange
{
return new BetweenRange(
$this->lower_bound,
$upper_bound,
false,
);
}

/**
* {@inheritDoc}
*
* @return ToRange<T>
*
* @psalm-mutation-free
*/
public function withoutLowerBound(): ToRange
{
return new ToRange($this->upper_bound, $this->upper_inclusive);
}

/**
* {@inheritDoc}
*
* @param T $lower_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withLowerBound(int|float $lower_bound): BetweenRange
{
return new static(
$lower_bound,
$this->upper_bound,
$this->upper_inclusive,
);
}

/**
* {@inheritDoc}
*
* @return FromRange<T>
*
* @psalm-mutation-free
*/
public function withoutUpperBound(): FromRange
{
return new FromRange($this->lower_bound);
}

/**
Expand All @@ -111,6 +198,34 @@ public function isUpperInclusive(): bool
return $this->upper_inclusive;
}

/**
* {@inheritDoc}
*
* @return static<T>
*
* @psalm-mutation-free
*/
public function withUpperInclusive(bool $upper_inclusive): static
{
return new static(
$this->lower_bound,
$this->upper_bound,
$upper_inclusive,
);
}

/**
* {@inheritDoc}
*
* @return T
*
* @psalm-mutation-free
*/
public function getLowerBound(): int|float
{
return $this->lower_bound;
}

/**
* {@inheritDoc}
*
Expand Down
83 changes: 83 additions & 0 deletions src/Psl/Range/FromRange.php
Expand Up @@ -57,6 +57,89 @@ public function contains(int|float $value): bool
return $value >= $this->lower_bound;
}

/**
* {@inheritDoc}
*
* @param T $lower_bound
*
* @return FromRange<T>
*
* @psalm-mutation-free
*/
public function withLowerBound(int|float $lower_bound): FromRange
{
return new FromRange(
$lower_bound,
);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBound(float|int $upper_bound, bool $upper_inclusive): BetweenRange
{
return new BetweenRange(
$this->lower_bound,
$upper_bound,
$upper_inclusive,
);
}

/**
* {@inheritDoc}
*
* @return FullRange<T>
*
* @psalm-mutation-free
*/
public function withoutLowerBound(): FullRange
{
/** @var FullRange<T> */
return new FullRange();
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundInclusive(float|int $upper_bound): BetweenRange
{
return new BetweenRange(
$this->lower_bound,
$upper_bound,
true,
);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return BetweenRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundExclusive(float|int $upper_bound): BetweenRange
{
return new BetweenRange(
$this->lower_bound,
$upper_bound,
false,
);
}

/**
* {@inheritDoc}
*
Expand Down
58 changes: 58 additions & 0 deletions src/Psl/Range/FullRange.php
Expand Up @@ -32,4 +32,62 @@ public function contains(int|float $value): bool
{
return true;
}

/**
* {@inheritDoc}
*
* @param T $lower_bound
*
* @return FromRange<T>
*
* @psalm-mutation-free
*/
public function withLowerBound(int|float $lower_bound): FromRange
{
return new FromRange(
$lower_bound,
);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return ToRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBound(float|int $upper_bound, bool $upper_inclusive): ToRange
{
return new ToRange($upper_bound, $upper_inclusive);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return ToRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundInclusive(float|int $upper_bound): ToRange
{
return new ToRange($upper_bound, true);
}

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return ToRange<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundExclusive(float|int $upper_bound): ToRange
{
return new ToRange($upper_bound, false);
}
}
44 changes: 43 additions & 1 deletion src/Psl/Range/LowerBoundRangeInterface.php
Expand Up @@ -17,6 +17,48 @@
*/
interface LowerBoundRangeInterface extends IteratorAggregate, RangeInterface
{
/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return UpperBoundRangeInterface<T>&LowerBoundRangeInterface<T>
*
* @psalm-mutation-free
*/
public function withUpperBound(int|float $upper_bound, bool $upper_inclusive): UpperBoundRangeInterface&LowerBoundRangeInterface;

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return UpperBoundRangeInterface<T>&LowerBoundRangeInterface<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundInclusive(int|float $upper_bound): UpperBoundRangeInterface&LowerBoundRangeInterface;

/**
* {@inheritDoc}
*
* @param T $upper_bound
*
* @return UpperBoundRangeInterface<T>&LowerBoundRangeInterface<T>
*
* @psalm-mutation-free
*/
public function withUpperBoundExclusive(int|float $upper_bound): UpperBoundRangeInterface&LowerBoundRangeInterface;

/**
* Remove the lower bound from the range.
*
* @return RangeInterface<T>
*
* @psalm-mutation-free
*/
public function withoutLowerBound(): RangeInterface;

/**
* Returns the lower bound of the range.
*
Expand All @@ -25,7 +67,7 @@ interface LowerBoundRangeInterface extends IteratorAggregate, RangeInterface
* @psalm-mutation-free
*/
public function getLowerBound(): int|float;

/**
* Returns an iterator for the range.
*
Expand Down

0 comments on commit 21d2c0a

Please sign in to comment.