Collections And Pipelines

Warning

This is the current planned CLEAR stdlib design. Full stdlib implementation and stabilization are not planned until v0.3. Treat these pages as design direction, not as a compatibility promise.

Status: planned, self-host required.

Collections should feel like Ruby and Elixir at the call site while still giving the compiler enough information to track allocation, mutation, ownership, effects, and capability use.

Planned Types

TypeStatusNotes
SliceprototypeBorrowed view over contiguous values.
List/vectorintrinsic todayGrowable contiguous collection.
Map/hashintrinsic todayHash map; deterministic views required for compiler output.
Setintrinsic todayHash set; deterministic views required for compiler output.
RangeprototypeNumeric iteration and slicing.
Pool/slabintrinsic todayStable handles for compiler/runtime structures.
Queue/dequeplannedAdd when compiler or scheduler code needs it.

Planned Transforms

APIStatusBehavior
eachself-host requiredSide-effect iteration, returns Void.
mapself-host requiredNew list from final block expression.
select / filterself-host requiredKeeps values where predicate is true.
rejectself-host requiredInverse filter.
filterMapself-host requiredMaps to ?T, keeps non-nil values.
flatMapself-host requiredMaps to collections and flattens.
reduce / foldself-host requiredExplicit accumulator.
any?, all?self-host requiredShort-circuit predicates.
findself-host requiredReturns ?T.
sum, countself-host requiredNumeric and predicate aggregation.
ORDER_BYself-host requiredExplicit sort by key expression.
keys, values, pairsself-host requiredMap traversal; explicit ordered variants where output order matters.
indexedself-host requiredReplacement for Ruby each_with_index.
withObject / foldIntoself-host requiredReplacement for Ruby each_with_object.

Pipeline Result Defaults

Pipelines may stream internally, but collection is determined by explicit terminal or destination type. A ~T[] destination keeps a stream; a T[] or T[]@list destination collects to a list; a HashMap<K,V> destination collects to a map if the pipeline shape supplies keys.

names: String[] = users
    |> SELECT { _.active?() }
    |> MAP { _.name };

names_stream: ~String[] = users
    |> SELECT { _.name };

Other result shapes are explicit:

users_by_id = users
    |> COLLECT_MAP { _.id => _ };

unique_names = users
    |> MAP { _.name }
    |> COLLECT_SET;

Decisions

Source: docs/stdlib/collections.md