ESC
Type to search...
S
Soli Docs

Collections

Arrays and hashes - Soli's primary collection types with powerful built-in methods.

Arrays

Array

Ordered, mutable collection of elements.

// Creating arrays
let numbers = [1, 2, 3, 4, 5];
let names = ["Alice", "Bob", "Charlie"];

// Type-annotated arrays
let scores: Int[] = [95, 87, 92, 88, 90];

// Array from range
let range_arr = range(1, 10);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]
let step_arr = range(0, 10, 2);  // [0, 2, 4, 6, 8]

// Access elements
print(numbers[0]);   // 1
print(numbers[-1]);  // 5 (last element)

// Modify elements
numbers[0] = 10;

Array Methods

.map(fn)

Transform each element using a function.

let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map(fn(x) x * 2);
print(doubled);  // [2, 4, 6, 8, 10]
.filter(fn)

Keep elements matching a condition.

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evens = numbers.filter(fn(x) x % 2 == 0);
print(evens);  // [2, 4, 6, 8, 10]
.reduce(fn, initial)

Accumulate to a single value.

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce(fn(acc, x) acc + x, 0);  // 55
.each(fn)

Iterate with side effects.

let numbers = [1, 2, 3];
numbers.each(fn(x) print(x));  // Prints each number
.find(fn) / .every(fn) / .some(fn)

Search and check array elements.

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// find - first matching element
let first_even = numbers.find(fn(x) x % 2 == 0);  // 2

// every - check if all elements match
let all_positive = numbers.every(fn(x) x > 0);  // true

// some - check if any element matches
let has_large = numbers.some(fn(x) x > 8);  // true
Method Chaining
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Chaining methods
let result = numbers
    .filter(fn(x) x % 2 == 0)   // [2, 4, 6, 8, 10]
    .map(fn(x) x * x)           // [4, 16, 36, 64, 100]
    .filter(fn(x) x < 50);      // [4, 16, 36]

print(result);  // [4, 16, 36]

Hashes

Hash

Key-value collection (dictionary/map).

// Creating hashes
let person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
};

// Alternative syntax with =>
let scores = {"Alice" => 95, "Bob" => 87, "Charlie" => 92};

// Nested hashes
let user = {
    "id": 1,
    "profile": {
        "name": "Alice",
        "email": "[email protected]"
    }
};

// Access values
print(person["name"]);   // "Alice"
print(person["age"]);    // 30
print(person["email"]);  // null (key doesn't exist)

// Modify values
person["age"] = 31;
person["country"] = "France";  // Add new key

Hash Methods

let scores = {"Alice": 90, "Bob": 85, "Charlie": 95, "Diana": 88};

// Get length
print(len(scores));  // 4

// Get all keys
let keys_list = keys(scores);   // ["Alice", "Bob", "Charlie", "Diana"]

// Get all values
let values_list = values(scores);  // [90, 85, 95, 88]

// Check if key exists
print(has_key(scores, "Alice"));   // true
print(has_key(scores, "Eve"));     // false

// Get entries as [key, value] pairs
let entries_list = entries(scores);
// [["Alice", 90], ["Bob", 85], ["Charlie", 95], ["Diana", 88]]

// Merge hashes
let defaults = {"Alice": 0, "Bob": 0};
let merged = merge(scores, defaults);

// map - transform entries
let curved = scores.map(fn(pair) {
    let name = pair[0];
    let score = pair[1];
    return [name, score + 5];
});
print(curved);  // {Alice: 95, Bob: 90, Charlie: 100, Diana: 93}

// filter - keep entries matching condition
let high_scores = scores.filter(fn(pair) {
    return pair[1] >= 90;
});
print(high_scores);  // {Alice: 90, Charlie: 95}