itclocks
Version:
An implementation of Interval Tree Clocks in TypeScript
61 lines (60 loc) • 2.65 kB
JavaScript
/**
* Copyright (C) 2017 Gabriel Batista Galli
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const Occurrences_1 = require("./Occurrences");
class Filler {
static fill(id, occurrence) {
if (id.isLeaf())
return Filler.fillWithLeafID(id, occurrence);
if (occurrence.isLeaf())
return occurrence;
return Filler.fillNonLeafs(id, occurrence);
}
static fillWithLeafID(leafID, occurrence) {
if (leafID.isZero())
return occurrence;
return Occurrences_1.Occurrences.with(occurrence.max());
}
static fillNonLeafs(id, occurrence) {
if (id.left.isOne())
return Filler.fillLeftOneID(id, occurrence);
if (id.right.isOne())
return Filler.fillRightOneID(id, occurrence);
return Filler.fillLeftRight(id, occurrence);
}
static fillLeftOneID(id, occurrence) {
let filledRight = Filler.fillRight(id, occurrence);
let max = Math.max(occurrence.left.max(), filledRight.min());
return Occurrences_1.Occurrences.with(occurrence.value, Occurrences_1.Occurrences.with(max), filledRight).normalize();
}
static fillRight(id, occurrence) {
return Filler.fill(id.right, occurrence.right);
}
static fillRightOneID(id, occurrence) {
let filledLeft = Filler.fillLeft(id, occurrence);
let max = Math.max(occurrence.right.max(), filledLeft.min());
return Occurrences_1.Occurrences.with(occurrence.value, filledLeft, Occurrences_1.Occurrences.with(max)).normalize();
}
static fillLeft(id, occurrence) {
return Filler.fill(id.left, occurrence.left);
}
static fillLeftRight(id, occurrence) {
return Occurrences_1.Occurrences.with(occurrence.value, Filler.fillLeft(id, occurrence), Filler.fillRight(id, occurrence)).normalize();
}
}
exports.Filler = Filler;
;