Readonly[toReadonlysizeStatic Readonly[species]Returns an iterable of entries in the map.
Brings names into scope without saying anything about the terms they take.
The variables to bring into scope
Whether some solution here can bind name: it is in scope and has a term left to take. The dual of
neverBinds, for the licences and guards that read the fact positively.
The variable to check
whether it can bind
true if an element in the Map existed and has been removed, or false if the element does not exist.
Returns an iterable of key, value pairs for every entry in the map.
Returns a specified element from the Map object. If the value that is associated to the provided key is an object, then you will get a reference to that object and any change made to that object will effectively modify it inside the Map.
Returns the element associated with the specified key. If no element is associated with the specified key, undefined is returned.
boolean indicating whether an element with the specified key exists or not.
Returns an iterable of keys in the map
Brings name into scope and narrows what is known about it: the variable has to satisfy both.
The variable to narrow
The term types it also has to satisfy
Whether no solution here binds name: it is out of scope, or in scope with a range no term satisfies.
The variable to check
whether it never binds; anything reading assertions against an operation wants those two as one
fact, bound(?x) being false either way
The term types name can be bound to here.
The variable to look up
its range, emptyRange when it is not in scope at all, since a variable this operation cannot bind takes no value in any of its solutions
Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.
Returns an iterable of values in the map
What an operation binds, as one structure: its key set is exactly the variables in scope - what
SELECT *expands to, thepVars- and the range stored for one is the term types it can hold when it is bound.Key presence and range are independent on purpose, which is what makes the merge sound. A key at emptyRange is a variable in scope that provably never binds, and it has to stay a key:
pVars(Empty_S) := S. A rewrite may still shrink the scope of an empty operation, as transformations/filterFalse!transformFilterFalse does.One case deliberately drops a key rather than bottoming its range: a
FILTER(!bound(?x))takes?xout of scope, which is what thepVarsthis replaced did too. The bottom range would say it more precisely, but (FBndII) reads absence as its emptiness proof, so moving it would change what the assertion pushdown concludes. Worth revisiting once the bottom has consumers.