About
A string generator that helps to implement real-time editing of an ordered sequence.
It makes reordering, sorting, interleaving transactions faster and simpler.
Usage
-
Get a string between two strings in the lexicographical(lexical or alphabetical) order.
final mid = between(prev: 'B', next: 'D'); assert( areEqual( [mid, 'D', 'B']..sort(), ['B', mid, 'D'], ), );
-
Generate order keys.
final keyCount = 100; final orderKeys = generateOrderKeys(keyCount);
This is useful for the following cases:
-
between
cannot be used because the table (collection) is empty.Future<void> addTodo(CreateTodo command) async { final String orderKey = todos.isEmpty ? generateOrderKeys(1).first // <== : between(prev: todos.last.orderKey); final todo = await todoRepository.create(command, orderKey); todos.add(todo); }
-
when migrating to an efficient ordered system.
Future<void> migrateToLexicalOrderSystem(Table table) async { final itemCount = table.count(); final orderKeys = generateOrderKeys(itemCount); /* omitted */ }
-
Caution
The between
function accepts only allowed characters as arguments
more precisely, the following code is used inside between
.
LexOrderValidator().checkBetweenArgs(prev: prev, next: next);
The LexOrderValidator
checks the following constraints:
-
both
prev
andnext
must be composed of alphabets. -
prev.isNotEmpty && next.isNotEmpty
-
prev != null && next != null
-
next != 'A'
-
prev != next
-
prev[prev.length-1] != 'A' && next[next.length-1] != 'A'
-
prev.compareTo(next) == -1
, for example:between(prev: 'C', next: 'B');
In debug mode, you get an error if you violate the above constraints. but not in release mode. you can check the constraints manually by using LexOrderValidator
.
I recommend you to only use between
and generateOrderKey
for generating keys. because this package is designed for that case only. If you use arguments generated by other sources for the between
function, the ordered state of your data may be broken.