Seq
This module provides functions for manipulating Sequences. Sequences are bi-directional, immutable data structures with constant time random element lookup. Strings in Yona are specially optimized sequences of UTF-8 characters.
Usage¶
There is a special syntax to create an empty sequence: [] or "". Sequences support special operators for adding elements or joining with other sequences.
Folding a sequence¶
Folding a sequence is a process of iterating over its values while producing one result value. An example of a folding function could be a sum function, that iterates over all elements and adds them up, producing a single result.
Sequences can be folded from both directions - left or right.
Module Seq contains functions foldl and foldr for folding from the left or right side respectively.
Functions foldl and foldr take 3 arguments: * 2-argument lambda (accumulator, element) returning a new value of an accumulator * initial value of the accumulator * sequence to fold
This example shows how to sum up a sequence:
Seq::foldl (\acc val -> acc + val) 0 [1, 2, 3]
Reducing a sequence¶
Reducing a sequence means applying a transducer onto a sequence. Transducers are a generic, high-level method for implementing operations over a data structure.
Function reduce takes 2 arguments: * transducer * sequence to reduce
Example with a filter transducer:
Seq::reducel (Transducers::filter \val -> val < 0 (0, \acc val -> acc + val, \acc -> acc * 2)) [-2,-1,0,1,2]
This example will produce -6, as it sums up all negative numbers in the sequence.
Obtaining a length of a sequence¶
Function len returns a length of a sequence:
length = Seq::len [1, 2, 3]
Splitting a sequence at an index¶
Function splitAt splits the sequence at a given index into a tuple of two sequences:
Seq::split_at 2 [1, 2, 3, 4, 5]
will yield ([1, 2], [3, 4, 5])
Checking whether a sequence is a string¶
Function is_string checks whether a sequence is a string. It can be useful in guard expressions for example.
Seq::is_string "hello"
will result in a true.
Looking up an element by an index¶
Function lookup takes an index and a sequence and returns an element on that index. It throws :badarg exception if the index is not found.
Seq::lookup 2 [1, 2, 3]
Taking first n elements¶
Function takes takes first n elements. It throws :badarg exception if the n is greater or equal than the length of the sequence.
Seq::take 2 [1, 2, 3] # returns [1, 2]
Dropping first n elements¶
Function drop drops first n elements. It throws :badarg exception if the n is greater or equal than the length of the sequence.
Seq::drops 2 [1, 2, 3] # returns [3]
Zipping two sequences into one¶
Function zip takes two sequences and produces one with tuples, one from each sequence.
Example:
Seq::zip [1, 2, 3] [4, 5, 6]
Will create a new sequence [(1, 4), (2, 5), (3, 6)].
Encoding / Decoding strings¶
Functions encode and decode convert Strings (UTF-8 character sequences) to and from Sequence of bytes.
Seq::encode "hello" |> Seq::decode # returns "hello"
Trimming whitespace¶
Returns a string whose value is this string, with all leading and trailing space removed, where space is defined as any character whose codepoint is less than or equal to U+0020 (the space character).
Seq::trim " hello " # returns "hello"
Flattening a sequence of sequences¶
Function flatten will flatten a nested sequence containing other sequences into a flat sequence.
Seq::flatten [[1, 2], [3, [4, 5, [6, 7]]]]
Will produce a new sequence [1, 2, 3, 4, 5, 6, 7].
Joining a sequence of strings with a separator¶
Function join takes a separator string and a sequence of strings to be join with them.
Seq::join "\n" ["line 1", "line2", "line 3"]
Will produce three lines:
line 1
line 2
line 3