truncate method
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();
});
}