<?php
namespace Fuse\Search\Bitap;
use function Fuse\Core\config;
function convertMaskToIndices(array $matchmask = [], ?int $minMatchCharLength = null): array
{
$minMatchCharLength = $minMatchCharLength ?? config('minMatchCharLength');
$indices = [];
$start = -1;
$end = -1;
$i = 0;
for ($len = sizeof($matchmask); $i < $len; $i += 1) {
$match = $matchmask[$i] ?? null;
if ($match && $start === -1) {
$start = $i;
} elseif (!$match && $start !== -1) {
$end = $i - 1;
if ($end - $start + 1 >= $minMatchCharLength) {
$indices[] = [$start, $end];
}
$start = -1;
}
}
// (i-1 - start) + 1 => i - start
if (($matchmask[$i - 1] ?? false) && $i - $start >= $minMatchCharLength) {
$indices[] = [$start, $i - 1];
}
return $indices;
}
|