Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/development/std/iter/adapters.nct

adapters.nct

//! Iterator adapter and view representations.

include ./index.nct

struct MapIter<U, I, F> {
    source: I
    transform: F
}

struct FilterIter<I, F> {
    source: I
    predicate: F
}

struct TakeIter<I> {
    source: I
    remaining: usize
}

struct SkipIter<I> {
    source: I
    remaining_to_skip: usize
}

struct ChainIter<L, R> {
    left: L
    right: R
    in_left: bool
}

struct EnumerateIter<I> {
    source: I
    next_index: usize
}

struct EmptyIter<T> {
    exhausted: bool
}

struct OnceIter<T> {
    item: T?
    remaining: usize
}

struct ViewIter<T> {
    view: &[T]
    next_index: usize
}

struct MutableViewIter<T> {
    view: &+[T]
    next_index: usize
}

construct ViewIter<T> {
    default func from_view(view: &[T]): Self {
        return ViewIter<T> {
            view: view,
            next_index: 0,
        }
    }
}

func remaining<T>(iterator: &ViewIter<T>): usize {
    return iterator.view.len() - iterator.next_index
}

conform ExactSizeIterator for ViewIter<T> {
    method &self.remaining_len(): usize {
        return remaining(self)
    }
}

conform Iterator for ViewIter<T> {
    method &+self.next(): &T? {
        if self.next_index >= self.view.len() {
            return none
        }
        let index: usize = self.next_index
        self.next_index = index + 1
        return &self.view[index]
    }
}