502 lines
12 KiB
Markdown
502 lines
12 KiB
Markdown
---
|
|
id: map-reference
|
|
title: Map
|
|
description: Map operations
|
|
hide_table_of_contents: true
|
|
---
|
|
|
|
import Syntax from '@theme/Syntax';
|
|
import SyntaxTitle from '@theme/SyntaxTitle';
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
type map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
type ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
type map ('key, 'value)
|
|
</SyntaxTitle>
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
The type of a map from values of type `key` to
|
|
values of type `value` is `map (key, value)`.
|
|
|
|
```pascaligo group=maps
|
|
type move is int * int
|
|
type register is map (address, move)
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
The type of a map from values of type `key` to values
|
|
of type `value` is `(key, value) map`.
|
|
|
|
```cameligo group=maps
|
|
type move = int * int
|
|
type register = (address, move) map
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
The type of a map from values of type `key` to
|
|
values of type `value` is `map (key, value)`.
|
|
|
|
```reasonligo group=maps
|
|
type move = (int, int);
|
|
type register = map (address, move);
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function empty : map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val empty : ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let empty: map('key, 'value)
|
|
</SyntaxTitle>
|
|
|
|
Create an empty map.
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const empty : register = Map.empty
|
|
```
|
|
|
|
Or
|
|
|
|
```pascaligo group=maps
|
|
const empty : register = map []
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let empty : register = Map.empty
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let empty : register = Map.empty
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function literal : list ('key * 'value) -> map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val literal : ('key * 'value) list -> ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let literal: list(('key, 'value)) => map('key, 'value)
|
|
</SyntaxTitle>
|
|
|
|
Create a non-empty map.
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const moves : register =
|
|
Map.literal (list [
|
|
(("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" : address), (1,2));
|
|
(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address), (0,3))]);
|
|
```
|
|
|
|
Alternative way of creating an empty map:
|
|
|
|
```pascaligo group=maps
|
|
const moves_alternative : register =
|
|
map [
|
|
("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" : address) -> (1,2);
|
|
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address) -> (0,3)];
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let moves : register =
|
|
Map.literal [
|
|
(("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" : address), (1,2));
|
|
(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address), (0,3))]
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let moves : register =
|
|
Map.literal ([
|
|
("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" : address, (1,2)),
|
|
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address, (0,3))]);
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function find_opt : 'key -> map ('key, 'value) -> option 'value
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val find_opt : 'key -> ('key, 'value) map -> 'value option
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let find_opt : ('key, map ('key, 'value)) => option ('value)
|
|
</SyntaxTitle>
|
|
|
|
Retrieve a (option) value from a map with the given key. Returns `None` if the
|
|
key is missing and the value otherwise.
|
|
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const my_balance : option (move) =
|
|
Map.find_opt (("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address), moves)
|
|
```
|
|
|
|
Alternatively:
|
|
|
|
```pascaligo group=maps
|
|
const my_balance_alternative : option (move) =
|
|
moves [("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address)];
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let my_balance : move option =
|
|
Map.find_opt ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address) moves
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let my_balance : option (move) =
|
|
Map.find_opt ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address, moves);
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function update : 'key -> option 'value -> map ('key, 'value) -> map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val update: 'key -> 'value option -> ('key, 'value) map -> ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let update: ('key, option('value), map('key, 'value)) => map ('key, 'value)
|
|
</SyntaxTitle>
|
|
|
|
Note: when `None` is used as a value, the key and associated value is removed
|
|
from the map.
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const updated_map : register = Map.update(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), Some (4,9), moves);
|
|
```
|
|
|
|
Alternatively:
|
|
|
|
```pascaligo group=maps
|
|
|
|
function update (var m : register) : register is
|
|
block {
|
|
m [("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address)] := (4,9);
|
|
} with m
|
|
|
|
```
|
|
|
|
If multiple bindings need to be updated, PascaLIGO offers a *patch
|
|
instruction* for maps, similar to that for records.
|
|
|
|
```pascaligo group=maps
|
|
function assignments (var m : register) : register is
|
|
block {
|
|
patch m with map [
|
|
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address) -> (4,9);
|
|
("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" : address) -> (1,2)
|
|
]
|
|
} with m
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let updated_map : register =
|
|
Map.update
|
|
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address) (Some (4,9)) moves
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let updated_map : register =
|
|
Map.update
|
|
(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), Some ((4,9)), moves);
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function add : 'key -> 'value -> map ('key, 'value) -> map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val add : 'key -> 'value -> ('key, 'value) map -> ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let add: ('key, 'value, map('key, 'value)) => map('key, 'value)
|
|
</SyntaxTitle>
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const added_item : register = Map.add (("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address), (4, 9), moves)
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let add (m : register) : register =
|
|
Map.add
|
|
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address) (4,9) m
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let add = (m: register): register =>
|
|
Map.add
|
|
(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" : address), (4,9), m);
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function remove : 'key -> map ('key, 'value) -> map ('key, 'value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val remove : 'key -> ('key, 'value) map -> ('key, 'value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let remove: (key, map('key, 'value)) => map('key, 'value)
|
|
</SyntaxTitle>
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
const updated_map : register =
|
|
Map.remove (("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), moves)
|
|
```
|
|
|
|
Alternatively, the instruction `remove key from map m` removes the key
|
|
`key` from the map `m`.
|
|
|
|
```pascaligo group=maps
|
|
function rem (var m : register) : register is
|
|
block {
|
|
remove ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address) from map moves
|
|
} with m
|
|
|
|
const updated_map : register = rem (moves)
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let updated_map : register =
|
|
Map.remove ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address) moves
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let updated_map : register =
|
|
Map.remove (("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), moves)
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function iter : ((key, value) -> unit) -> map (key, value) -> unit
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val iter : (('key * 'value) -> unit) -> ('key, 'value) map -> unit
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let iter: ((('key, 'value)) => unit, map('key, 'value)) => unit
|
|
</SyntaxTitle>
|
|
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
function iter_op (const m : register) : unit is
|
|
block {
|
|
function iterated (const i : address; const j : move) : unit is
|
|
if j.1 > 3 then Unit else (failwith ("Below range.") : unit)
|
|
} with Map.iter (iterated, m)
|
|
```
|
|
|
|
> Note that `map_iter` is *deprecated*.
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let iter_op (m : register) : unit =
|
|
let predicate = fun (i,j : address * move) -> assert (j.0 > 3)
|
|
in Map.iter predicate m
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let iter_op = (m : register) : unit => {
|
|
let predicate = ((i,j) : (address, move)) => assert (j[0] > 3);
|
|
Map.iter (predicate, m);
|
|
};
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function map : (('key, 'value) -> ('mapped_key, 'mapped_item)) -> map ('key, 'value) -> map ('mapped_key, 'mapped_value)
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val map : (('key * 'value) -> ('mapped_key * 'mapped_item)) -> (key, value) map -> (mapped_key, mapped_value) map
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let map: ((('key, 'value)) => ('mapped_key, 'mapped_item), map(key, value)) => map(mapped_key, mapped_value)
|
|
</SyntaxTitle>
|
|
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
function map_op (const m : register) : register is
|
|
block {
|
|
function increment (const i : address; const j : move) : move is
|
|
(j.0, j.1 + 1)
|
|
} with Map.map (increment, m)
|
|
```
|
|
|
|
> Note that `map_map` is *deprecated*.
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let map_op (m : register) : register =
|
|
let increment = fun (i,j : address * move) -> j.0, j.1 + 1
|
|
in Map.map increment m
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let map_op = (m : register) : register => {
|
|
let increment = ((i,j): (address, move)) => (j[0], j[1] + 1);
|
|
Map.map (increment, m);
|
|
};
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function fold : (('accumulator -> ('key, 'value) -> 'accumulator) -> map ('key, 'value) -> 'accumulator) -> 'accumulator
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val fold : ('accumulator -> ('key * 'value) -> 'accumulator) -> ('key, 'value) map -> 'accumulator -> 'accumulator
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let fold: ((('accumulator, ('key, 'value)) => 'accumulator), map('key, 'value), 'accumulator) => 'accumulator
|
|
</SyntaxTitle>
|
|
|
|
|
|
<Syntax syntax="pascaligo">
|
|
|
|
```pascaligo group=maps
|
|
function fold_op (const m : register) : int is
|
|
block {
|
|
function folded (const i : int; const j : address * move) : int is
|
|
i + j.1.1
|
|
} with Map.fold (folded, m, 5)
|
|
```
|
|
|
|
> Note that `map_fold` is *deprecated*.
|
|
|
|
</Syntax>
|
|
<Syntax syntax="cameligo">
|
|
|
|
```cameligo group=maps
|
|
let fold_op (m : register) : int =
|
|
let folded = fun (i,j : int * (address * move)) -> i + j.1.1
|
|
in Map.fold folded m 5
|
|
```
|
|
|
|
</Syntax>
|
|
<Syntax syntax="reasonligo">
|
|
|
|
```reasonligo group=maps
|
|
let fold_op = (m : register) : int => {
|
|
let folded = ((i,j): (int, (address, move))) => i + j[1][1];
|
|
Map.fold (folded, m, 5);
|
|
};
|
|
```
|
|
|
|
</Syntax>
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function size : map ('key, 'value) -> nat
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val size : ('key, 'value) map -> nat
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let size: map('key, 'value) => nat
|
|
</SyntaxTitle>
|
|
|
|
Returns the number of items in the map.
|
|
|
|
|
|
<SyntaxTitle syntax="pascaligo">
|
|
function mem : key -> map (key, value) -> bool
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="cameligo">
|
|
val mem : 'key -> ('key, 'value) map => bool
|
|
</SyntaxTitle>
|
|
<SyntaxTitle syntax="reasonligo">
|
|
let mem : ('key, map('key, 'value)) => bool
|
|
</SyntaxTitle>
|
|
|
|
Checks if a key exists in the map.
|
|
|