blob: 24deb1976f23f29e450995ee7518357dd75465d2 [file]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:collection';
import 'dart:js_interop';
import 'pair.dart';
import 'set_like.dart';
import 'utils.dart';
/// The JavaScript `Map` type.
///
/// **Note:** unlike Dart maps, JavaScript maps do not support customizable
/// equality comparisons. Keys will always be compared using [same-value-zero
/// equality].
///
/// [same-value-zero equality]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Equality_comparisons_and_sameness#same-value-zero_equality
@JS('Map')
extension type JSMap<K extends JSAny?, V extends JSAny?>._(JSObject _)
implements JSObject, JSIterable<JSArray>, JSSetLike<K> {
/// Returns a Dart iterable of key/value pairs in this map.
Iterable<(K, V)> get pairs =>
_entries().toDartIterable.map((entry) => entry.toDart);
/// Returns a copy of this map as a Dart [LinkedHashMap].
///
/// This map's equality relation is identical to the JS Map's, meaning that it
/// considers `NaN` to be equivalent to `NaN`.
Map<K, V> get toDart {
var map = LinkedHashMap<K, V>(equals: sameValueZeroEquals);
iterate(_entries(), (entry) => map[entry.$1] = entry.$2);
return map;
}
/// See [`new Map()`].
///
/// [`new Map()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/Map
external JSMap([JSIterableProtocol<JSArray> iterable]);
/// See [`Map.clear()`].
///
/// [`Map.clear()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear
external void clear();
/// See [`Map.delete()`].
///
/// [`Map.delete()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete
external bool delete(JSAny? key);
@JS('entries')
external JSIterable<JSPair<K, V>> _entries();
/// See [`Map.get()`].
///
/// [`Map.get()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get
V? operator [](JSAny? key) => _get(key);
@JS('get')
external V? _get(JSAny? key);
/// See [`Map.keys()`].
///
/// [`Map.keys()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys
JSIterable<K> get keys => _keys();
@JS('keys')
external JSIterable<K> _keys();
/// See [`Map.set()`].
///
/// [`Map.set()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set
void operator []=(K key, V value) => _set(key, value);
@JS('set')
external void _set(K key, V value);
/// See [`Map.values()`].
///
/// [`Map.values()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values
JSIterable<V> get values => _values();
@JS('values')
external JSIterable<V> _values();
}