pub struct Gn<A = ()> { /* private fields */ }
Expand description
Generator helper
Implementations§
source§impl<A> Gn<A>
impl<A> Gn<A>
sourcepub fn new_scoped<'a, T, F>(f: F) -> Generator<'a, A, T>
pub fn new_scoped<'a, T, F>(f: F) -> Generator<'a, A, T>
create a scoped generator with default stack size
Examples found in repository?
examples/pipe.rs (lines 6-11)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn square<'a, T: Iterator<Item = u32> + Send + 'a>(input: T) -> Generator<'a, (), u32> {
Gn::new_scoped(|mut s| {
for i in input {
s.yield_with(i * i);
}
done!();
})
}
// fn sum<'a, T: Iterator<Item = u32> + 'a>(input: T) -> impl Iterator<Item = u32> + 'a {
fn sum<'a, T: Iterator<Item = u32> + Send + 'a>(input: T) -> Generator<'a, (), u32> {
Gn::new_scoped(|mut s| {
let mut acc = 0;
for i in input {
acc += i;
s.yield_with(acc);
}
done!();
})
}
More examples
examples/range.rs (lines 5-12)
3 4 5 6 7 8 9 10 11 12 13 14 15 16
fn main() {
let n = 100000;
let range = Gn::new_scoped(move |mut s| {
let mut num = 0;
while num < n {
s.yield_(num);
num += 1;
}
done!();
});
let sum: usize = range.sum();
println!("sum ={sum}");
}
examples/fib.rs (lines 4-12)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
fn main() {
let g = Gn::new_scoped(|mut s| {
let (mut a, mut b) = (0, 1);
while b < 200 {
std::mem::swap(&mut a, &mut b);
b += a;
s.yield_(b);
}
done!();
});
for i in g {
println!("{i}");
}
}
examples/number.rs (lines 4-17)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
fn factors(n: u32) -> Generator<'static, (), u32> {
Gn::new_scoped(move |mut s| {
if n == 0 {
return 0;
}
s.yield_with(1);
for i in 2..n {
if n % i == 0 {
s.yield_with(i);
}
}
done!();
})
}
examples/yield_from.rs (lines 16-20)
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
fn main() {
let g1 = Gn::new(|| xrange(0, 10));
let g2 = Gn::new(|| xrange(10, 20));
let g = Gn::new_scoped(|mut s| {
s.yield_from(g1);
s.yield_from(g2);
done!();
});
g.fold(0, |sum, x| {
println!("i={}, sum={}", x, sum + x);
sum + x
});
}
examples/lifetime.rs (lines 4-16)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() {
let str = "foo".to_string();
let mut gen = generator::Gn::new_scoped(|mut s| {
std::thread::scope(|s2| {
s2.spawn(|| {
std::thread::sleep(std::time::Duration::from_millis(500));
println!("{str}");
});
// here we can't use `yield_` because it still ref to `str`
// `yield_` only impl for static captured lifetime
// s.yield_(());
unsafe { s.yield_unsafe(()) };
});
generator::done!();
});
gen.next();
// std::mem::forget(gen);
// drop(gen);
// drop(str);
std::thread::sleep(std::time::Duration::from_millis(1000));
}
Additional examples can be found in:
sourcepub fn new_scoped_local<'a, T, F>(f: F) -> LocalGenerator<'a, A, T>
pub fn new_scoped_local<'a, T, F>(f: F) -> LocalGenerator<'a, A, T>
create a scoped local generator with default stack size
sourcepub fn new_scoped_opt<'a, T, F>(size: usize, f: F) -> Generator<'a, A, T>
pub fn new_scoped_opt<'a, T, F>(size: usize, f: F) -> Generator<'a, A, T>
create a scoped generator with specified stack size
sourcepub fn new_scoped_opt_local<'a, T, F>(
size: usize,
f: F
) -> LocalGenerator<'a, A, T>
pub fn new_scoped_opt_local<'a, T, F>( size: usize, f: F ) -> LocalGenerator<'a, A, T>
create a scoped local generator with specified stack size
source§impl<A: Any> Gn<A>
impl<A: Any> Gn<A>
sourcepub fn new<'a, T: Any, F>(f: F) -> Generator<'a, A, T>
👎Deprecated since 0.6.18: please use scope
version instead
pub fn new<'a, T: Any, F>(f: F) -> Generator<'a, A, T>
scope
version insteadcreate a new generator with default stack size
Examples found in repository?
More examples
examples/yield_from.rs (line 13)
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
fn main() {
let g1 = Gn::new(|| xrange(0, 10));
let g2 = Gn::new(|| xrange(10, 20));
let g = Gn::new_scoped(|mut s| {
s.yield_from(g1);
s.yield_from(g2);
done!();
});
g.fold(0, |sum, x| {
println!("i={}, sum={}", x, sum + x);
sum + x
});
}
examples/send.rs (line 20)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
fn main() {
// we specify the send type is u32
let mut s = Gn::<u32>::new(|| sum(0));
// first start the generator
assert_eq!(s.raw_send(None).unwrap(), 0);
let mut cur = 1;
let mut last = 1;
while !s.is_done() {
// println!("send={}", last);
mem::swap(&mut cur, &mut last);
cur = s.send(cur); // s += cur
// println!("cur={} last={}", cur, last);
println!("{cur}");
}
}
Auto Trait Implementations§
impl<A> RefUnwindSafe for Gn<A>where
A: RefUnwindSafe,
impl<A> Send for Gn<A>where
A: Send,
impl<A> Sync for Gn<A>where
A: Sync,
impl<A> Unpin for Gn<A>where
A: Unpin,
impl<A> UnwindSafe for Gn<A>where
A: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more