Myrddin: Slice Manipulation

Slice Manipulation

``````pkg std =
generic sleq    : (a : @a[:], b : @a[:] -> bool)
generic slcp        : (dst : @a[:], src : @a[:] -> void)
generic slput   : (sl : @a[:], idx : size, elt : @a -> @a[:])
generic slpush  : (sl : @a[:], elt : @a -> @a[:])
generic slpop   : (sl : @a[:] -> (@a, @a[:]))
generic sldup       : (sl : @a[:] -> @a[:])
generic slfill  : (sl : @a[:], v : @a   -> @a[:])
generic sljoin  : (dst : @a[:]#, src : @a[:]    -> @a[:])
;;
``````

Functions

``````generic sleq    : (a : @a[:], b : @a[:] -> bool)
``````

Compares if two slices are equal, elementwise. Uses the '==' operator for each value. Returns true if they are equal, false otherwise.

``````generic slcp    : (dst : @a[:], src : @a[:] -> void)
``````

Copies all the elements from `src` to `dst`. The copy made is shallow, and done using the `=` operator. The two slices must be equal size. If they are not equal, this will cause the program to abort.

``````generic slput   : (sl : @a[:], idx : size, elt : @a -> @a[:])
``````

Inserts a value `elt` into the slice `sl` at index `idx`, moving all values from `sl[idx:len]` to `sl[idx+1:len+1]`. This assumes that the slice is either empty, or is allocated on the heap using `slalloc`.

This may move the slice, invalidating the original input argument.

``````generic slpush  : (sl : @a[:], elt : @a -> @a[:])
``````

Inserts a value `elt` into the slice `sl` at index the end of the slice.

This may move the slice, invalidating the original input argument.

``````generic slpop   : (sl : @a[:] -> (@a, @a[:]))
``````

Removes an element from the end of the slice, returning the element and the new, truncated slice.

This may move the slice, invalidating the original input argument.

``````generic sldup   : (sl : @a[:] -> @a[:])
``````

Duplicates a slice. This function is equivalent to calling slalloc() followed by slcp().

``````generic slfill  : (sl : @a[:], v : @a   -> @a[:])
``````

Fills a slice with a value.

``````generic sljoin  : (dst : @a[:]#, src : @a[:]    -> @a[:])
``````

Concatenates `src` onto the end of `dst#`. Equivalent to iterating through every element of `src` and `slpush()`ing it onto `dst`.