truncate method

  1. @override
Future<void> truncate(
  1. int newLength
)

Changes the logical length.

Implementation

@override
Future<void> truncate(int newLength) async {
  _checkWritable();
  if (newLength < 0) throw RangeError.value(newLength, 'newLength');
  await _serialize(() async {
    final oldLength = _length;
    _length = newLength;
    _metaDirty = true;
    if (newLength < oldLength) {
      final remainder = newLength % chunkSize;
      final boundary = newLength ~/ chunkSize;
      if (remainder != 0) {
        await _loadChunks([boundary]);
        final chunk = _cachedChunk(boundary);
        chunk.fillRange(remainder, chunkSize, 0);
        await _store.putMany({idbChunkKey(path, boundary): chunk});
        _putCache(boundary, chunk);
      }
      final firstDeleted = remainder == 0 ? boundary : boundary + 1;
      final oldLast = (oldLength + chunkSize - 1) ~/ chunkSize - 1;
      if (firstDeleted <= oldLast) {
        await _store.deleteChunkRange(
          idbChunkKey(path, firstDeleted),
          idbChunkKey(path, oldLast),
        );
      }
      _cache.removeWhere((index, _) => index >= firstDeleted);
    }
    await _persistMeta();
  });
}