"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChunkSlice = void 0;
const hash_1 = require("../../../json-hash/hash");
const hash_2 = require("../../../json-crdt/hash");
const clock_1 = require("../../../json-crdt-patch/clock");
class ChunkSlice {
    constructor(
    /** Chunk from which slice is computed. */
    chunk, 
    /** Start offset of the slice within the chunk. */
    off, 
    /** Length of the slice. */
    len) {
        this.off = off;
        this.len = len;
        // ----------------------------------------------------------------- Stateful
        this.hash = 0;
        this.chunk = chunk;
    }
    id() {
        const id = this.chunk.id;
        const off = this.off;
        return !off ? id : new clock_1.Timestamp(id.sid, id.time + off);
    }
    key() {
        const id = this.chunk.id;
        const sid = id.sid;
        const time = id.time + this.off;
        return sid.toString(36) + time.toString(36);
    }
    view() {
        const offset = this.off;
        return this.chunk.view().slice(offset, offset + this.len);
    }
    refresh() {
        const { chunk, off, len } = this;
        const delOffLenState = (((off << 16) + len) << 1) + +chunk.del;
        let state = hash_1.CONST.START_STATE;
        state = (0, hash_2.updateId)(state, chunk.id);
        state = (0, hash_1.updateNum)(state, delOffLenState);
        return (this.hash = state);
    }
    // ---------------------------------------------------------------- Printable
    toString(tab = '') {
        const name = 'ChunkSlice';
        const off = this.off;
        const len = this.len;
        const str = this.view() + '';
        const truncate = str.length > 32;
        const view = JSON.stringify(truncate ? str.slice(0, 32) : str) + (truncate ? ' …' : '');
        const id = (0, clock_1.printTs)(this.chunk.id);
        return `${name} ${id} [${off}..${off + len}) ${view}`;
    }
}
exports.ChunkSlice = ChunkSlice;
//# sourceMappingURL=ChunkSlice.js.map