shelly-shell 0.5.3

A Rust based Unix style shell with a typed and structured language syntax.
visible `__stream
visible "__stream_Reader"

pub struct Item { pub value: any }
pub type Reader = __stream_Reader
pub type Error = ErrorValue

pub fn from_iterable($items: any): Reader | ErrorValue { __stream "from_iterable" $items (Item) }
pub fn Reader::next_item(): any | () | ErrorValue { __stream "next" $self }
pub fn Reader::close(): () | ErrorValue { __stream "close" $self }

pub struct Mapped { source: Reader, convert: any }
pub fn Mapped::new($source: Reader, $convert: any): Mapped { Mapped(source: $source, convert: $convert) }
pub fn Mapped::next_item(): Item | () | ErrorValue
{
    let $item = $self.::source.next_item
    if $item == () { return () }
    let $convert = $self.::convert
    let $value = if $item.type == Item { $item.value } else { $item }
    Item(value: ($convert $value))
}
pub fn Mapped::close(): () | ErrorValue { $self.::source.close }
pub fn map($source: Reader, $convert: any): Reader | ErrorValue
{
    let $reader = from_iterable Mapped(source: $source, convert: $convert)
    __stream "inherit_iteration" $reader $source
}

pub struct Filtered { source: Reader, keep: any }
pub fn Filtered::new($source: Reader, $keep: any): Filtered { Filtered(source: $source, keep: $keep) }
pub fn Filtered::next_item(): Item | () | ErrorValue
{
    let $keep = $self.::keep
    loop
    {
        let $item = $self.::source.next_item
        if $item == () { return () }
        let $value = if $item.type == Item { $item.value } else { $item }
        if ($keep $value) { return Item(value: $value) }
    }
}
pub fn Filtered::close(): () | ErrorValue { $self.::source.close }
pub fn filter($source: Reader, $keep: any): Reader | ErrorValue
{
    let $reader = from_iterable Filtered(source: $source, keep: $keep)
    __stream "inherit_iteration" $reader $source
}

pub fn collect($source: Reader): Array | ErrorValue
{
    let $items = []
    for $item in $source
    { $items = [$items..., (if $item.type == Item { $item.value } else { $item })] }
    $items
}

pub fn reader($next: any, $result: any | (), $close: any | (),
              $context: any | (), $boxed: Boolean | ()): Reader | ErrorValue
{
    __stream "reader" [$next, $result, $close, $context, $boxed] (Item)
}
pub fn Reader::get_result(): any | ErrorValue { __stream "result" $self }

pub fn Reader::new($next: any, $result: any | (), $close: any | (),
                   $context: any | (), $boxed: Boolean | ()): Reader | ErrorValue
{
    __stream "reader" [$next, $result, $close, $context, $boxed] (Item)
}

pub fn Reader::get_context(): any { __stream "context" $self }