module List
Library functions for lists.
Usage
import List;
Dependencies
import Exception;
import Map;
Description
The following library functions are available for lists:
- concat
- delete
- distribution
- drop
- dup
- elementAt
- getFirstFrom
- getOneFrom
- head
- headTail
- index
- indexOf
- insertAt
- intercalate
- intersperse
- isEmpty
- isSorted
- itoString
- last
- lastIndexOf
- mapper
- max
- merge
- min
- mix
- permutations
- permutationsBag
- pop
- prefix
- push
- reducer
- remove
- removeFromBag
- reverse
- shuffle
- size
- slice
- sort
- split
- sum
- tail
- take
- takeOneFrom
- takeWhile
- toMap
- toMapUnique
- toRel
- toSet
- toString
- top
- unzip2
- unzip3
- upTill
- zip2
- zip3
function concat
Concatenate a list of lists.
list[&T] concat(list[list[&T]] xxs)
Examples
rascal>import List;
ok
rascal>concat([]);
list[void]: []
rascal>concat([[]]);
list[void]: []
rascal>concat([[1]]);
list[int]: [1]
rascal>concat([[1],[],[2,3]]);
list[int]: [1,2,3]
rascal>concat([[1,2],[3],[4,5],[]]);
list[int]: [1,2,3,4,5]
function delete
Delete an element from a list.
list[&T] delete(list[&T] lst, int n)
Delete the n
-th element from a list. A new list without the n
-th element is returned as result.
The IndexOutOfBounds
exception is thrown when n is not a valid index.
Examples
rascal>import List;
ok
rascal>delete([1, 2, 3], 1);
list[int]: [1,3]
rascal>delete(["zebra", "elephant", "snake", "owl"], 2);
list[str]: ["zebra","elephant","owl"]
function distribution
Get the distribution of the elements of the list. That is how often does each element occur in the list?.
map[&T element, int occurs] distribution(list[&T] lst)
Examples
rascal>import List;
ok
rascal>distribution([4,4,4,3,1,2,1,1,3,4]);
map[int element, int occurs]: (1:3,3:2,2:1,4:4)
function drop
Drop elements from the head of a list.
list[&T] drop(int n, list[&T] lst)
Drop n
elements (or size(lst)
elements if size(lst) < n
) from the head of lst
.
See Take to get elements from the head of a list].
Examples
rascal>import List;
ok
rascal>drop(2, [5, 1, 7, 3]);
list[int]: [7,3]
rascal>drop(10, [5, 1, 7, 3]);
list[int]: []
rascal>drop(2, ["zebra", "elephant", "snake", "owl"]);
list[str]: ["snake","owl"]
function dup
Remove multiple occurrences of elements in a list. The first occurrence remains.
list[&T] dup(list[&T] lst)
Examples
rascal>import List;
ok
rascal>dup([3, 1, 5, 3, 1, 7, 1, 2]);
list[int]: [3,1,5,7,2]
function elementAt
&T elementAt(list[&T] lst, int index)
function getOneFrom
Pick a random element from a list.
&T getOneFrom(list[&T] lst)
Get an arbitrary element from a list. See TakeOneFrom for a function that also removes the selected element.
Examples
rascal>import List;
ok
rascal>getOneFrom(["zebra", "elephant", "snake", "owl"]);
str: "owl"
---
owl
---
rascal>getOneFrom(["zebra", "elephant", "snake", "owl"]);
str: "elephant"
---
elephant
---
rascal>getOneFrom(["zebra", "elephant", "snake", "owl"]);
str: "elephant"
---
elephant
---
function getFirstFrom
Pick first element from a list.
&T getFirstFrom([&T f, *&T _])
&T getFirstFrom(list[&T] _ :[])
Get the first element from a list. As opposed to GetOneFrom this function always returns the same (first) list element.
function head
Get the first element(s) from a list.
&T head([&T h, *&T _])
&T head(list[&T] _:[])
list[&T] head(list[&T] lst, int n) throws IndexOutOfBounds
- Returns the first element of a list or throws
EmptyList
when the list is empty. This is identical to Top. - Returns the first
n
elements of a list or throwsIndexOutOfBounds
when the list is too short. This is similar to Take.
Examples
rascal>import List;
ok
Get the first element:
rascal>head([1, 2, 3]);
int: 1
rascal>head(["zebra", "elephant", "snake", "owl"]);
str: "zebra"
---
zebra
---
An exception is thrown when taking the head of an empty list:
rascal>head([]);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(4213,9,<161,31>,<161,40>): EmptyList()
at head(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(4182,45,<161,0>,<161,45>))
at $shell$(|prompt:///|(0,9,<1,0>,<1,9>))
ok
Get the first n elements:
rascal>head([1, 2, 3, 4], 2);
list[int]: [1,2]
rascal>head(["zebra", "elephant", "snake", "owl"], 2);
list[str]: ["zebra","elephant"]
An exception is thrown when the second argument exceeds the length of the list:
rascal>head([1, 2, 3, 5], 5);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(4267,106,<164,0>,<165,64>): IndexOutOfBounds(4)
at *** somewhere ***(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(4267,106,<164,0>,<165,64>))
at head(|prompt:///|(19,1,<1,19>,<1,20>))
ok
function headTail
Split a list in a head and a tail.
tuple[&T, list[&T]] headTail([&T h, *&T t])
tuple[&T, list[&T]] headTail(list[&T] _:[])
This function is identical to Pop.
Examples
rascal>import List;
ok
rascal>headTail([3, 1, 4, 5]);
tuple[int,list[int]]: <3,[1,4,5]>
rascal>pop([3, 1, 4, 5]);
tuple[int,list[int]]: <3,[1,4,5]>
rascal>headTail(["zebra", "elephant", "snake", "owl"]);
tuple[str,list[str]]: <"zebra",["elephant","snake","owl"]>
function index
A list of legal index values of a list.
list[int] index(list[&T] lst)
Returns a list of all legal index values for a given list lst
.
Examples
rascal>import List;
ok
rascal>index([1, 3, 5]);
list[int]: [0,1,2]
rascal>index(["zebra", "elephant", "snake", "owl"]);
list[int]: [0,1,2,3]
Benefits
This function is useful in for loops over lists.
function indexOf
Index of first occurrence of an element in a list.
int indexOf(list[&T] lst, &T elt)
Return index of first occurrence of elt
in lst
, or -1
if elt
is not found.
Also see LastIndexOf.
Examples
rascal>import List;
ok
rascal>indexOf([3, 1, 4, 5], 4);
int: 2
rascal>indexOf([3, 1, 4, 5], 7);
int: -1
rascal>indexOf(["zebra", "elephant", "snake", "owl"], "snake");
int: 2
rascal>indexOf(["zebra", "elephant", "snake", "owl"], "eagle");
int: -1
function insertAt
Insert an element at a specific position in a list.
list[&T] insertAt(list[&T] lst, int n, &T elm) throws IndexOutOfBounds
Returns a new list with the value of elm
inserted at index position n
of the old list.
Examples
rascal>import List;
ok
rascal>insertAt([1,2,3], 1, 5);
list[int]: [1,5,2,3]
rascal>insertAt(["zebra", "elephant", "snake", "owl"], 2, "eagle");
list[str]: ["zebra","elephant","eagle","snake","owl"]
An exception is thrown when the index position is outside the list:
rascal>insertAt([1,2,3], 10, 5);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(5624,549,<225,0>,<241,76>): IndexOutOfBounds(10)
at *** somewhere ***(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(5624,549,<225,0>,<241,76>))
at insertAt(|prompt:///|(22,1,<1,22>,<1,23>))
ok
function intercalate
Join a list of values into a string separated by a separator.
str intercalate(str sep, list[value] l)
Examples
rascal>import List;
ok
rascal>intercalate("/", [3]);
str: "3"
---
3
---
rascal>intercalate("/", [3, 1, 4, 5]);
str: "3/1/4/5"
---
3/1/4/5
---
rascal>intercalate(", ", [3, 1, 4, 5]);
str: "3, 1, 4, 5"
---
3, 1, 4, 5
---
rascal>intercalate(", ", ["zebra", "elephant", "snake", "owl"]);
str: "zebra, elephant, snake, owl"
---
zebra, elephant, snake, owl
---
function intersperse
Intersperses a list of values with a separator.
list[&T] intersperse(&T sep, list[&T] xs)
Examples
rascal>import List;
ok
rascal>intersperse(", ", ["a","b","c"]);
list[str]: ["a",", ","b",", ","c"]
rascal>intersperse(0, [1, 2, 3]);
list[int]: [1,0,2,0,3]
rascal>intersperse(1, []);
list[int]: []
rascal>intersperse([], [1]);
list[value]: [1]
function isEmpty
Test whether a list is empty.
bool isEmpty(list[&T] lst)
Returns true
when a list is empty and false
otherwise.
Examples
rascal>import List;
ok
rascal>isEmpty([]);
bool: true
rascal>isEmpty([1, 2, 3]);
bool: false
function last
Return the last element of a list, if any.
&T last(list[&T] lst) throws EmptyList
Also see Tail that returns a list of one or more of the last elements of a list.
Examples
rascal>import List;
ok
rascal>last([1]);
int: 1
rascal>last([3, 1, 4, 5]);
int: 5
rascal>last(["zebra", "elephant", "snake", "owl"]);
str: "owl"
---
owl
---
rascal>tail([3, 1, 4, 5]);
list[int]: [1,4,5]
function lastIndexOf
Return index of last occurrence of elt in lst, or -1 if elt is not found.
int lastIndexOf(list[&T] lst, &T elt)
Also see IndexOf.
Examples
rascal>import List;
ok
rascal>lastIndexOf([3, 1, 4, 5, 4], 4);
int: 4
rascal>lastIndexOf([3, 1, 4, 5, 4], 7);
int: -1
rascal>lastIndexOf(["zebra", "owl", "elephant", "snake", "owl"], "owl");
int: 4
function mapper
Apply a function to all list elements and return list of results.
list[&U] mapper(list[&T] lst, &U (&T) fn)
Apply a function fn
to each element of lst
and return the list of results.
Examples
rascal>import List;
ok
rascal>int incr(int x) { return x + 1; }
int (int): function(|prompt:///|(0,33,<1,0>,<1,33>))
rascal>mapper([1, 2, 3, 4], incr);
list[int]: [2,3,4,5]
function max
Determine the largest element in a list.
&T max([&T h, *&T t])
&T max(list[&T] _:[])
Examples
rascal>import List;
ok
rascal>max([1, 3, 5, 2, 4]);
int: 5
rascal>max(["zebra", "elephant", "snake", "owl"]);
str: "zebra"
---
zebra
---
function merge
Merge the elements of two sorted lists into one list.
list[&T] merge(list[&T] left, list[&T] right)
list[&T] merge(list[&T] left, list[&T] right, bool (&T a, &T b) lessOrEqual)
Merge the elements of two sorted lists into one list using the built-in ordering between values.
Optional, a comparison function lessOrEqual
may be given for a user-defined ordering between values.
Examples
rascal>import List;
ok
rascal>merge([1, 3, 5], [2, 7, 9, 15]);
list[int]: [1,2,3,5,7,9,15]
rascal>merge(["ape", "elephant", "owl", "snale", "zebra"], ["apple", "berry", "orange", "pineapple"]);
list[str]: ["ape","apple","berry","elephant","orange","owl","pineapple","snale","zebra"]
Merge two lists of strings and use their length as ordering:
rascal>import String;
ok
rascal>merge(["ape", "owl", "snale", "zebra", "elephant"], ["apple", "berry", "orange", "pineapple"], bool(str x, str y){ return size(x) <= size(y); });
list[str]: ["ape","owl","snale","zebra","apple","berry","orange","elephant","pineapple"]
function min
Determine the smallest element in a list.
&T min([&T h, *&T t])
&T min(list[&T] _: [])
Examples
rascal>import List;
ok
rascal>min([1, 3, 5, 2, 4]);
int: 1
rascal>min(["zebra", "elephant", "snake", "owl"]);
str: "elephant"
---
elephant
---
function mix
Mix the elements of two lists.
list[&T] mix(list[&T] l, list[&T] r)
Let n be the minimum of the length of the two lists l
and r
.
mix
returns a list in which the first n
elements are taken alternately from the left and the right list,
followed by the remaining elements of the longest list.
Examples
rascal>import List;
ok
rascal>mix([3, 1, 7, 5, 9], [15, 25, 35]);
list[int]: [3,15,1,25,7,35,5,9]
rascal>mix([3, 1, 7], [15, 25, 35, 45, 55]);
list[int]: [3,15,1,25,7,35,45,55]
rascal>mix([3, 1, 7], ["elephant", "snake"]);
list[value]: [3,"elephant",1,"snake",7]
function permutations
Compute all permutations of a list.
set[list[&T]] permutations(list[&T] lst)
Examples
rascal>import List;
ok
rascal>permutations([1,2,3]);
set[list[int]]: {
[3,2,1],
[1,2,3],
[2,1,3],
[1,3,2],
[2,3,1],
[3,1,2]
}
function permutationsBag
set[list[&T]] permutationsBag(map[&T element, int occurs] b)
function pop
Pop top element from list, return a tuple.
tuple[&T, list[&T]] pop(list[&T] lst)
This function is identical to Head Tail. Also see Push and Top.
Examples
rascal>import List;
ok
rascal>pop([3, 1, 4, 5]);
tuple[int,list[int]]: <3,[1,4,5]>
rascal>headTail([3, 1, 4, 5]);
tuple[int,list[int]]: <3,[1,4,5]>
rascal>pop(["zebra", "elephant", "snake", "owl"]);
tuple[str,list[str]]: <"zebra",["elephant","snake","owl"]>
function prefix
Return all but the last element of a list.
list[&T] prefix(list[&T] lst)
Examples
rascal>import List;
ok
rascal>prefix([3, 1, 4, 5]);
list[int]: [3,1,4]
rascal>prefix([]);
list[void]: []
rascal>prefix(["zebra", "elephant", "snake", "owl"]);
list[str]: ["zebra","elephant","snake"]
function push
Push an element in front of a list.
list[&T] push(&T elem, list[&T] lst)
Examples
rascal>import List;
ok
rascal>push(7, [3, 1, 4, 5]);
list[int]: [7,3,1,4,5]
rascal>push("eagle", ["zebra", "elephant", "snake", "owl"]);
list[str]: ["eagle","zebra","elephant","snake","owl"]
function reducer
Apply a function to successive elements of list and combine the results (deprecated).
&T reducer(list[&T] lst, &T (&T, &T) fn, &T unit)
Apply the function fn
to successive elements of list lst
starting with unit
.
Examples
rascal>import List;
ok
rascal>int add(int x, int y) { return x + y; }
int (int, int): function(|prompt:///|(0,39,<1,0>,<1,39>))
rascal>reducer([10, 20, 30, 40], add, 0);
int: 100
Benefits
Pitfalls
This function is deprecated, use a reducer expression instead. E.g. (init | f(it, e) | e <- lst)
.
function remove
list[&T] remove(list[&T] lst, int indexToDelete)
function removeFromBag
map[&T element, int occurs] removeFromBag(map[&T element, int occurs] b, &T el)
map[&T element, int occurs] removeFromBag(map[&T element, int occurs] b, &T el, int nr)
function reverse
Reverse a list.
list[&T] reverse(list[&T] lst)
Returns a list with the elements of lst
in reverse order.
Examples
rascal>import List;
ok
rascal>reverse([1,4,2,3]);
list[int]: [3,2,4,1]
rascal>reverse(["zebra", "elephant", "snake", "owl"]);
list[str]: ["owl","snake","elephant","zebra"]
function size
Determine the number of elements in a list.
int size(list[&T] lst)
Examples
rascal>import List;
ok
rascal>size([20, 10, 30]);
int: 3
rascal>size(["zebra", "elephant", "snake", "owl"]);
int: 4
function slice
Compute a sublist of a list.
list[&T] slice(list[&T] lst, int begin, int len)
Returns a sublist of lst
from index start
of length len
.
In most cases it is better to use the built-in slice notation, see the example below.
Examples
rascal>import List;
ok
rascal>slice([10, 20, 30, 40, 50, 60], 2, 3);
list[int]: [30,40,50]
rascal>slice(["zebra", "elephant", "snake", "owl"], 1, 2);
list[str]: ["elephant","snake"]
Here are the equivalent expressions using the slice notation:
rascal>[10, 20, 30, 40, 50, 60][2 .. 5];
list[int]: [30,40,50]
rascal>["zebra", "elephant", "snake", "owl"][1 .. 3];
list[str]: ["elephant","snake"]
WARNING: In the slice notation the upper bound is exclusive.
function sort
Sort the elements of a list.
list[&T] sort(list[&T] lst)
list[&T] sort(list[&T] l, bool (&T a, &T b) less)
Sort the elements of a list:
- Use the built-in ordering on values to compare list elements.
- Give an additional
lessThan
function that will be used to compare elements.
Examples
rascal>import List;
ok
rascal>import String;
ok
rascal>sort([10, 4, -2, 11, 100, 5]);
list[int]: [-2,4,5,10,11,100]
rascal>fruits = ["mango", "strawberry", "pear", "pineapple", "banana", "grape", "kiwi"];
list[str]: ["mango","strawberry","pear","pineapple","banana","grape","kiwi"]
rascal>sort(fruits);
list[str]: ["banana","grape","kiwi","mango","pear","pineapple","strawberry"]
rascal>sort(fruits, bool(str a, str b){ return size(a) > size(b); });
list[str]: ["strawberry","pineapple","banana","grape","mango","pear","kiwi"]
function isSorted
Check whether a list is sorted or not.
bool isSorted(list[&T] l, bool (&T a, &T b) less = bool (&T a, &T b) { return a < b; })
Checks whether or not a list is sorted by searching for any out-of-order elements. The empty list is defined to be "sorted" and what sorted means is defined the higher-order parameter "less" which should implement a partial-order relation between the two parameters.
function shuffle
Shuffle a list.
list[&T] shuffle(list[&T] l)
Returns a random (unbiased) shuffled list.
Examples
rascal>import List;
ok
rascal>shuffle([1,4,2,3]);
list[int]: [3,1,2,4]
rascal>shuffle(["zebra", "elephant", "snake", "owl"]);
list[str]: ["zebra","owl","elephant","snake"]
function shuffle
Shuffle a list with a seed.
list[&T] shuffle(list[&T] l, int seed)
Returns a random (unbiased) shuffled list, every call with the same seed shuffles in the same order.
Examples
rascal>import List;
ok
rascal>shuffle([1,2,3,4]);
list[int]: [2,4,1,3]
rascal>shuffle([1,2,3,4]);
list[int]: [1,4,3,2]
rascal>shuffle([1,2,3,4], 1);
list[int]: [4,1,3,2]
rascal>shuffle([1,2,3,4], 1);
list[int]: [4,1,3,2]
function split
Split a list into two halves.
tuple[list[&T],list[&T]] split(list[&T] l)
Examples
rascal>import List;
ok
rascal>split([3, 1, 4, 5, 7]);
tuple[list[int],list[int]]: <[3,1],[4,5,7]>
rascal>split(["zebra", "elephant", "snake", "owl"]);
tuple[list[str],list[str]]: <["zebra","elephant"],["snake","owl"]>
function sum
Sum the elements of a list.
(&T <:num) sum([(&T <: num) hd, *(&T <: num) tl])
(&T <:num) sum(list[&T] _: [])
Examples
rascal>import List;
ok
rascal>sum([3, 1, 4, 5]);
int: 13
rascal>sum([3, 1.5, 4, 5]);
num: 13.5
function tail
Get the tail element(s) from a list.
list[&T] tail([&T _, *&T t])
list[&T] tail(list[&T] _:[])
list[&T] tail(list[&T] lst, int len) throws IndexOutOfBounds
- Return a list consisting of all but the first element of
lst
. - Return a list consisting of the last
n
elements oflst
.
Examples
All but first element:
rascal>import List;
ok
rascal>tail([10,20,30]);
list[int]: [20,30]
Try an error case:
rascal>tail([]);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(17241,9,<693,37>,<693,46>): EmptyList()
at tail(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(17204,51,<693,0>,<693,51>))
at $shell$(|prompt:///|(0,9,<1,0>,<1,9>))
ok
Last n elements:
rascal>tail([10, 20, 30, 40, 50, 60], 3);
list[int]: [40,50,60]
Try an error case:
rascal>tail([10, 20, 30, 40, 50, 60], 10);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(17258,108,<695,0>,<696,66>): IndexOutOfBounds(4)
at *** somewhere ***(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(17258,108,<695,0>,<696,66>))
at tail(|prompt:///|(31,2,<1,31>,<1,33>))
ok
function take
Get number of elements from the head of a list.
list[&T] take(int n, list[&T] lst)
Get n
elements (or size(lst)
elements if size(lst) < n
) from the head of the list.
See Drop to remove elements from the head of a list.
Examples
rascal>import List;
ok
rascal>take(2, [3, 1, 4, 5]);
list[int]: [3,1]
rascal>take(6, [3, 1, 4, 5]);
list[int]: [3,1,4,5]
rascal>take(2, ["zebra", "elephant", "snake", "owl"]);
list[str]: ["zebra","elephant"]
function takeOneFrom
Remove an arbitrary element from a list, returns the element and the modified list.
tuple[&T, list[&T]] takeOneFrom(list[&T] lst)
Select an arbitrary element from lst
, and return a tuple consisting of:
- the selected element, and
- a new list consisting of all elements of
lst
except the selected element.
See GetOneFrom to only selected an element from a list.
Examples
rascal>import List;
ok
rascal>takeOneFrom([10,20,30,40,50]);
tuple[int,list[int]]: <50,[10,20,30,40]>
rascal>takeOneFrom([10,20,30,40,50]);
tuple[int,list[int]]: <30,[10,20,40,50]>
rascal>takeOneFrom([10,20,30,40,50]);
tuple[int,list[int]]: <40,[10,20,30,50]>
rascal>takeOneFrom(["zebra", "elephant", "snake", "owl"]);
tuple[str,list[str]]: <"elephant",["zebra","snake","owl"]>
rascal>takeOneFrom(["zebra", "elephant", "snake", "owl"]);
tuple[str,list[str]]: <"zebra",["elephant","snake","owl"]>
rascal>takeOneFrom(["zebra", "elephant", "snake", "owl"]);
tuple[str,list[str]]: <"snake",["zebra","elephant","owl"]>
function takeWhile
Take elements from the front of the list as long as a predicate is true.
list[&T] takeWhile(list[&T] lst, bool (&T a) take)
Examples
rascal>import List;
ok
rascal>bool isEven(int a) = a mod 2 == 0;
bool (int): function(|prompt:///|(0,34,<1,0>,<1,34>))
rascal>takeWhile([2,4,6,8,1,2,3,4,5],isEven);
list[int]: [2,4,6,8]
function toMap
Convert a list of pairs to a map; first elements are associated with a set of second elements.
map[&A,list[&B]] toMap(list[tuple[&A, &B]] lst) throws MultipleKey
Convert a list of tuples to a map in which the first element of each tuple is associated with the set of second elements from all tuples with the same first element. Keys should be unique.
Examples
rascal>import List;
ok
rascal>toMap([<1,10>, <1, 11>, <2, 20>, <3, 30>, <3, 31>]);
map[int, list[int]]: (
1:[10,11],
3:[30,31],
2:[20]
)
Pitfalls
toMap
collects all values in tuples with the same first value in a set.
Contrast this with toMapUnique
that associates each first tuple value with the second tuple value,
but imposes the constraint that those keys are unique.
function toMapUnique
Convert a list of tuples to a map; result must be a map.
map[&A,&B] toMapUnique(list[tuple[&A, &B]] lst) throws MultipleKey
Convert a list of tuples to a map; result must be a map.
Examples
rascal>import List;
ok
rascal>toMapUnique([<1,10>, <2, 20>, <3, 30>]);
map[int, int]: (1:10,3:30,2:20)
Let's explore an error case:
rascal>toMapUnique([<1,10>, <1, 11>, <2, 20>, <3, 30>]);
|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(19688,630,<778,0>,<797,72>): MultipleKey(1,10,11)
at *** somewhere ***(|file:///home/runner/actions-runner/_work/rascal/rascal/src/org/rascalmpl/library/List.rsc|(19688,630,<778,0>,<797,72>))
at toMapUnique(|prompt:///|(43,2,<1,43>,<1,45>))
ok
Pitfalls
The keys in a map are unique by definition.
toMapUnique
throws a MultipleKey
exception when the list contains more than one tuple with the same first value.
function top
Take the top element of a list.
&T top([&T t, *&T _])
This function is identical to Head. Also see Pop and Push.
Examples
rascal>import List;
ok
rascal>top([3, 1, 4, 5]);
int: 3
rascal>top(["zebra", "elephant", "snake", "owl"]);
str: "zebra"
---
zebra
---
function toRel
Convert a list to a relation.
rel[&T,&T] toRel(list[&T] lst)
Convert a list to relation, where each tuple encodes which elements are followed by each other. This function will return an empty relation for empty lists and for singleton lists.
Examples
rascal>import List;
ok
rascal>toRel([3, 1, 4, 5]);
rel[int,int]: {
<1,4>,
<3,1>,
<4,5>
}
rascal>toRel(["zebra", "elephant", "snake", "owl"]);
rel[str,str]: {
<"snake","owl">,
<"zebra","elephant">,
<"elephant","snake">
}
function toSet
Convert a list to a set.
set[&T] toSet(list[&T] lst)
Convert lst
to a set.
Examples
rascal>import List;
ok
rascal>toSet([10, 20, 30, 40]);
set[int]: {10,40,20,30}
rascal>toSet(["zebra", "elephant", "snake", "owl"]);
set[str]: {"snake","owl","zebra","elephant"}
Note that the same can be done using splicing
rascal>l = [10,20,30,40];
list[int]: [10,20,30,40]
rascal>s = {*l};
set[int]: {10,40,20,30}
function toString
Convert a list to a string.
str toString(list[&T] lst)
Convert lst
to a string.
Examples
rascal>import List;
ok
rascal>toString([10, 20, 30]);
str: "[10,20,30]"
---
[10,20,30]
---
rascal>toString(["zebra", "elephant", "snake", "owl"]);
str: "[\"zebra\",\"elephant\",\"snake\",\"owl\"]"
---
["zebra","elephant","snake","owl"]
---
function itoString
Convert a list to an indented string.
str itoString(list[&T] lst)
Convert lst
to a indented string.
Examples
rascal>import List;
ok
rascal>itoString([10, 20, 30]);
str: "[10,20,30]"
---
[10,20,30]
---
rascal>itoString(["zebra", "elephant", "snake", "owl"]);
str: "[\"zebra\",\"elephant\",\"snake\",\"owl\"]"
---
["zebra","elephant","snake","owl"]
---
function unzip2
Make a pair (triple) of lists from a list of pairs (triples).
tuple[list[&T],list[&U]] unzip2(list[tuple[&T,&U]] lst)
Also see Unzip3;
Examples
rascal>import List;
ok
rascal>unzip2([<3,"thirty">, <1,"ten">, <4,"forty">]);
tuple[list[int],list[str]]: <[3,1,4],["thirty","ten","forty"]>
rascal>unzip3([<3,"thirty",300>, <1,"ten",100>, <4,"forty",400>]);
tuple[list[int],list[str],list[int]]: <[3,1,4],["thirty","ten","forty"],[300,100,400]>
function unzip3
tuple[list[&T],list[&U],list[&V]] unzip3(list[tuple[&T,&U,&V]] lst)
function upTill
Returns the list 0,1..n-1.
list[int] upTill(int n)
Returns the list 0
, 1
, .., n-1
, this is slightly faster than [0..n]
, since the returned values are shared.
Examples
rascal>import List;
ok
rascal>upTill(10);
list[int]: [0,1,2,3,4,5,6,7,8,9]
function zip2
Make a list of pairs from two (three) lists of the same length.
list[tuple[&T first, &U second]] zip2(list[&T] a, list[&U] b)
Also see Unzip3.
Examples
rascal>import List;
ok
rascal>zip2([3, 1, 4], ["thirty", "ten", "forty"]);
lrel[int first,str second]: [
<3,"thirty">,
<1,"ten">,
<4,"forty">
]
rascal>zip3([3, 1, 4], ["thirty", "ten", "forty"], [300, 100, 400]);
lrel[int first,str second,int third]: [
<3,"thirty",300>,
<1,"ten",100>,
<4,"forty",400>
]
function zip3
list[tuple[&T first, &U second, &V third]] zip3(list[&T] a, list[&U] b, list[&V] c)