Files
Decodal/doc/manual/source/language/expression/array.md
T

1.9 KiB

Array Expression

An array expression represents an ordered sequence of values.

[1, 2, 3]
["a", "b", "c"]

An array literal is a concrete value and does not require all elements to have the same type.

["api", 8080, true]

Array constraint

Write an array constraint by placing an ellipsis immediately after [, followed by an element constraint.

Names = [...String];
Ports = [...(Int & >= 1 & <= 65535)];

[...T] represents an array of zero or more elements, all of which satisfy T. An empty array satisfies every array constraint.

[...String] & []
[...String] & ["api", "worker"]

The element constraint can be an object range. A field with a default that exists only on the right remains abstract in every element when the array constraint is composed. Its default is selected only if the array is later materialized.

Services = [...{
    name = String;
    enabled = Bool default true;
}];

Services & [{ name = "api"; }]

Applying an array constraint to a concrete array refines each element against the element range using the same rules as as. For an object element range, a field present only on the left produces an error, while a field present only on the right remains abstract.

Decodal does not provide an abstract array type without an element constraint. The former Array primitive type is unavailable, and T is required in [...T]. [String] is not an array constraint; it is a concrete one-element array containing the unresolved String constraint. An array constraint describes only the element range. It has no length, positional tuple, or uniqueness constraints.

Array concatenation

++ concatenates two concrete arrays.

base = ["read", "write"];
extra = ["admin"];
roles = base ++ extra;

roles has the same value as:

["read", "write", "admin"]

++ does not transform array elements. Elements from the right side follow those from the left.