list_fn/
take.rs

1use super::*;
2
3pub struct TakeList<L: ListFn> {
4    next: L,
5    count: usize,
6}
7
8impl<L: ListFn> ListFn for TakeList<L> {
9    type Item = L::Item;
10    type End = ();
11    fn next(self) -> ListState<Self> {
12        if self.count == 0 {
13            ListState::End(())
14        } else {
15            match self.next.next() {
16                ListState::Some(some) => ListState::some(
17                    some.first,
18                    TakeList {
19                        next: some.next,
20                        count: self.count - 1,
21                    },
22                ),
23                ListState::End(_) => ListState::End(()),
24            }
25        }
26    }
27}
28
29pub trait Take: ListFn {
30    fn take(self, count: usize) -> TakeList<Self> {
31        TakeList { next: self, count }
32    }
33}
34
35impl<L: ListFn> Take for L {}