Reowkred into a namespace structure that splits different utils into seperate packages with the prefix `flan-utils-`.

Fortune for flan-utils-rs's current commit: Future curse − 末凶
master
Avril 1 year ago
parent 432653398e
commit 34ed1b98f6
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -1,19 +1,14 @@
[package]
name = "flan-utils"
version = "0.1.0"
authors = ["Avril <flanchan@cumallover.me>"]
edition = "2018"
license = "MIT"
[workspace]
members = [
"flan-utils-macros",
"flan-utils-iter",
]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "unwind"
strip=true
[features]
default = ["macros"]
# #![no_std] support
no_std = []
# Enable the macros section
macros = []
[dependencies]

@ -0,0 +1,12 @@
[package]
name = "flan-utils-iter"
version = "0.1.0"
authors = ["Avril <flanchan@cumallover.me>"]
edition = "2018"
license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
[dependencies]

@ -0,0 +1,34 @@
//! Extensions
use super::*;
use std::{
iter::{self, Fuse,}
};
pub trait TaekTwoExt: Iterator
{
fn take_two(self) -> TakeTwo<Self>;
}
#[derive(Debug, Clone)]
pub struct TakeTwo<I: ?Sized + Iterator>(I);
impl<T, I: Iterator<Item=T> + ?Sized> Iterator for TakeTwo<I>
{
type Item = (T, Option<T>);
#[inline]
fn next(&mut self) -> Option<Self::Item>
{
let first = self.0.next()?;
Some((first, self.0.next()))
}
}
impl<I: Iterator> TaekTwoExt for I
where I: Iterator + Sized
{
#[inline]
fn take_two(self) -> TakeTwo<Self> {
TakeTwo(self)
}
}
//TODO: XXX: Copy all other iterator `ext` traits like `Collection: Extend<T>, U: Into<T>` (e.g. `String` with `char`) joining and such from older projects

@ -0,0 +1,13 @@
//! Collection of iterator (and tuple) tools
mod ext;
pub mod tuple;
pub use crate::{
ext::{
TaekTwoExt,
TakeTwo,
},
tuple::{
UntupleTwoExt,
TryUntupleTwoExt,
},
};

@ -0,0 +1,79 @@
//! Tuple traits
use super::*;
pub trait TryUntupleTwoExt<T,U>: Sized
{
type Wrapper<S>;
fn both(self) -> Self::Wrapper<(T, U)>;
}
impl<T, U> TryUntupleTwoExt<T, U> for (T, Option<U>)
{
type Wrapper<S> = Option<S>;
#[inline]
fn both(self) -> Self::Wrapper<(T, U)> {
match self {
(first, Some(second)) => Some((first, second)),
_ => None,
}
}
}
impl<T, U> TryUntupleTwoExt<T, U> for (Option<T>, U)
{
type Wrapper<S> = Option<S>;
#[inline]
fn both(self) -> Self::Wrapper<(T, U)> {
match self {
(Some(first), second) => Some((first, second)),
_ => None,
}
}
}
impl<T, U> TryUntupleTwoExt<T, U> for (Option<T>, Option<U>)
{
type Wrapper<S> = Option<S>;
#[inline]
fn both(self) -> Self::Wrapper<(T, U)> {
match self {
(Some(first), Some(second)) => Some((first, second)),
_ => None,
}
}
}
pub trait UntupleTwoExt<T,U,V>: Sized
{
type Unwrapped<A,B,C>;
fn untuple(self) -> Self::Unwrapped<T,U,V>;
}
impl<T, U, V> UntupleTwoExt<T,U,V> for (T, (U, V))
{
type Unwrapped<A,B,C> = (A,B,C);
#[inline]
fn untuple(self) -> Self::Unwrapped<T,U,V> {
(self.0, self.1.0, self.1.1)
}
}
impl<T, U> UntupleTwoExt<T,U,()> for (T, (U,))
{
type Unwrapped<A,B,C> = (A,B);
#[inline]
fn untuple(self) -> Self::Unwrapped<T,U,()> {
(self.0, self.1.0)
}
}
impl<T> UntupleTwoExt<T,(),()> for (T,)
{
type Unwrapped<A,B,C> = A;
#[inline]
fn untuple(self) -> Self::Unwrapped<T,(),()> {
self.0
}
}

@ -0,0 +1,19 @@
[package]
name = "flan-utils-macros"
version = "0.1.0"
authors = ["Avril <flanchan@cumallover.me>"]
edition = "2018"
license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
default = ["macros"]
# #![no_std] support
no_std = []
# Enable the macros section
macros = []
[dependencies]
Loading…
Cancel
Save