remorhaz/int-rangesets

整数范围集合操作

v0.3.0 2024-02-11 17:48 UTC

This package is auto-updated.

Last update: 2024-09-11 19:12:12 UTC


README

Latest Stable Version Build Status Scrutinizer Code Quality codecov Mutation testing badge License

这个小型库允许操作整数集合。

需求

  • PHP 8.1, 8.2, 8.3。

安装

composer require remorhaz/int-rangesets

用法

简介

集合 以连续 范围 的形式表示;每个范围由一对整数表示,表示它的第一个和最后一个值。

范围

范围不能为空,但只能包含一个整数;在这种情况下,它的第一个和最后一个值是相同的。

<?php

use Remorhaz\IntRangeSets\Range;

// Contains values: 5, 6, 7, 8
$range1 = new Range(5, 8);

// Contains value 12
$range2 = new Range(12);

范围是不可变的。对范围的任何操作都会创建一个新的实例,而保留原始实例不变。

<?php

use Remorhaz\IntRangeSets\Range;

// Contains values: 5, 6, 7, 8
$range1 = new Range(5, 8);

// New range has first value replaced and contains values: 7, 8
$range2 = $range1->withStart(7);

范围集合

集合中的所有范围都进行了规范化:它们按升序排列,并由非空间隔分隔,因此没有一个紧接在另一个后面或重叠。

范围集合也是不可变的。对集合的任何操作都会创建一个新的实例,而保留原始实例不变。

<?php

use Remorhaz\IntRangeSets\Range;
use Remorhaz\IntRangeSets\RangeSet;

// Contains single range [3..5]
$rangeSet1 = RangeSet::create(new Range(3, 5));

// Added range [4..10] partially overlaps already existing one.
// Resulting range set contains single merged range [3..10].
$rangeSet2 = $rangeSet1->withRanges(new Range(4, 10));

范围合并需要资源,因此存在一种快速但不可靠的方式来用范围初始化集合。在这种情况下,构建代码必须完全负责范围的规范化。

<?php

use Remorhaz\IntRangeSets\Range;
use Remorhaz\IntRangeSets\RangeSet;

// Creates range with two ranges: [2..5] and [7..8].
$rangeSet1 = RangeSet::createUnsafe(new Range(2, 5), new Range(7, 8));

警告:对非规范化范围集合的操作将返回不正确的结果!请使用带有任意范围列表的 create() 方法。

可用操作

在所有示例中,$a$b$result 是实现 \Remorhaz\IntRangeSets\RangeSetInterface 的对象。

许可证

此库根据 MIT 许可证 许可。