heh
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/util.rs b/src/util.rs
index d70ef3b..e56aec4 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -1,5 +1,6 @@
#![allow(non_snake_case, unused_macros, unused_unsafe)]
+use Default::default;
use regex::Regex;
use rustc_hash::FxHashMap as HashMap;
use rustc_hash::FxHashSet as HashSet;
@@ -20,11 +21,12 @@ pub mod prelude {
pub(crate) use super::{C, bits, dang, leek, mat, shucks};
pub use super::{
DigiCount, Dir, FilterBy, FilterBy3, GreekTools, IntoCombinations, IntoLines, IterͶ,
- MapWith, NumTupleIterTools, ParseIter, Printable, Skip, SplitU8, Str, TakeLine,
- TupleIterTools2, TupleIterTools2R, TupleIterTools3, TupleUtils, UnifiedTupleUtils,
- UnsoundUtilities, Widen, countmap, even, gcd, gt, infinite_successors, l, lcm, lt, nail,
- pa, r, rand, reading, reading::Ext, sort, twice, Ͷ, Α, Κ, Λ, Μ,
+ MapWith, NumTupleIterTools, ParseIter, PartitionByKey, Printable, Skip, SplitU8, Str,
+ TakeLine, TupleIterTools2, TupleIterTools2R, TupleIterTools3, TupleUtils,
+ UnifiedTupleUtils, UnsoundUtilities, Widen, countmap, even, gcd, gt, infinite_successors,
+ l, lcm, lt, nail, pa, r, rand, reading, reading::Ext, sort, twice, Ͷ, Α, Κ, Λ, Μ,
};
+ pub use Default::default;
pub use itertools::Itertools;
pub use itertools::iproduct;
pub use itertools::izip;
@@ -1847,3 +1849,28 @@ fn md5(x: &[u8]) -> [u8; 16] {
hasher.update(x);
*hasher.finalize().as_array::<16>().unwrap()
}
+pub trait PartitionByKey<T> {
+ fn partition_by_key<V, U: Extend<V> + Default>(
+ self,
+ f: impl FnMut(&T) -> bool,
+ key: impl FnMut(T) -> V,
+ ) -> [U; 2];
+}
+
+impl<T, I: Iterator<Item = T>> PartitionByKey<T> for I {
+ fn partition_by_key<V, U: Extend<V> + Default>(
+ self,
+ mut f: impl FnMut(&T) -> bool,
+ mut key: impl FnMut(T) -> V,
+ ) -> [U; 2] {
+ let mut o: [U; 2] = [default(), default()];
+ for x in self {
+ match f(&x) {
+ true => &mut o[0],
+ false => &mut o[1],
+ }
+ .extend_one(key(x));
+ }
+ o
+ }
+}