5 releases (3 breaking)
0.4.0 | May 23, 2024 |
---|---|
0.3.1 | May 23, 2024 |
0.3.0 | May 22, 2024 |
0.2.0 | May 22, 2024 |
0.1.0 | May 22, 2024 |
#1244 in Rust patterns
25KB
270 lines
A Transaction
can be used to make changes to an iterator and only apply the changes if the
transaction is committed. When the Transaction
is rolled back, the changes are
discarded. This is useful for implementing backtracking searches, parsers, undo functionality,
unlimited peeking and more.
The original iterator must implement 'Clone' to be useable with the transactional iterator.
Policies
Transactions can be created with 3 different policies:
Panic
:
Will panic on drop if not committed or rolled back.Rollback
:
Will rollback changes on drop or panic.AutoCommit
:
Will commit changes on drop or panic.
Example
use transactional_iterator::{Transaction, Panic};
let mut iter = vec![1, 2, 3].into_iter();
let mut transaction = Transaction::new(&mut iter, Panic);
// iterate within the transaction
assert_eq!(transaction.next(), Some(1));
assert_eq!(transaction.next(), Some(2));
// Commit the transaction
transaction.commit();
// The changes are now applied
assert_eq!(iter.next(), Some(3));