{"version":3,"file":"_selection-model-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/collections/selection-model.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Subject} from 'rxjs';\n\n/**\n * Class to be used to power selecting one or more options from a list.\n */\nexport class SelectionModel<T> {\n  /** Currently-selected values. */\n  private _selection = new Set<T>();\n\n  /** Keeps track of the deselected options that haven't been emitted by the change event. */\n  private _deselectedToEmit: T[] = [];\n\n  /** Keeps track of the selected options that haven't been emitted by the change event. */\n  private _selectedToEmit: T[] = [];\n\n  /** Cache for the array value of the selected items. */\n  private _selected: T[] | null = null;\n\n  /** Selected values. */\n  get selected(): T[] {\n    if (!this._selected) {\n      this._selected = Array.from(this._selection.values());\n    }\n\n    return this._selected;\n  }\n\n  /** Event emitted when the value has changed. */\n  readonly changed = new Subject<SelectionChange<T>>();\n\n  /**\n   * Exposes selection/deselection methods that work on array of values and don't expect a spread.\n   * This is useful in the cases where you may have a large collection of items that can't be\n   * easily spread into the existing methods without hitting browser limits.\n   */\n  readonly bulk: Readonly<{\n    select: (values: T[]) => boolean;\n    deselect: (values: T[]) => boolean;\n    setSelection: (values: T[]) => boolean;\n  }> = {\n    select: values => this._select(values),\n    deselect: values => this._deselect(values),\n    setSelection: values => this._setSelection(values),\n  };\n\n  constructor(\n    private _multiple = false,\n    initiallySelectedValues?: T[],\n    private _emitChanges = true,\n    public compareWith?: (o1: T, o2: T) => boolean,\n  ) {\n    if (initiallySelectedValues && initiallySelectedValues.length) {\n      if (_multiple) {\n        initiallySelectedValues.forEach(value => this._markSelected(value));\n      } else {\n        this._markSelected(initiallySelectedValues[0]);\n      }\n\n      // Clear the array in order to avoid firing the change event for preselected values.\n      this._selectedToEmit.length = 0;\n    }\n  }\n\n  /**\n   * Selects a value or an array of values.\n   * @param values The values to select\n   * @return Whether the selection changed as a result of this call\n   */\n  select(...values: T[]): boolean {\n    return this._select(values);\n  }\n\n  /**\n   * Deselects a value or an array of values.\n   * @param values The values to deselect\n   * @return Whether the selection changed as a result of this call\n   */\n  deselect(...values: T[]): boolean {\n    return this._deselect(values);\n  }\n\n  /**\n   * Sets the selected values\n   * @param values The new selected values\n   * @return Whether the selection changed as a result of this call\n   */\n  setSelection(...values: T[]): boolean {\n    return this._setSelection(values);\n  }\n\n  /**\n   * Toggles a value between selected and deselected.\n   * @param value The value to toggle\n   * @return Whether the selection changed as a result of this call\n   */\n  toggle(value: T): boolean {\n    return this.isSelected(value) ? this.deselect(value) : this.select(value);\n  }\n\n  /**\n   * Clears all of the selected values.\n   * @param flushEvent Whether to flush the changes in an event.\n   *   If false, the changes to the selection will be flushed along with the next event.\n   * @return Whether the selection changed as a result of this call\n   */\n  clear(flushEvent = true): boolean {\n    this._unmarkAll();\n    const changed = this._hasQueuedChanges();\n    if (flushEvent) {\n      this._emitChangeEvent();\n    }\n    return changed;\n  }\n\n  /**\n   * Determines whether a value is selected.\n   */\n  isSelected(value: T): boolean {\n    return this._selection.has(this._getConcreteValue(value));\n  }\n\n  /**\n   * Determines whether the model does not have a value.\n   */\n  isEmpty(): boolean {\n    return this._selection.size === 0;\n  }\n\n  /**\n   * Determines whether the model has a value.\n   */\n  hasValue(): boolean {\n    return !this.isEmpty();\n  }\n\n  /**\n   * Sorts the selected values based on a predicate function.\n   */\n  sort(predicate?: (a: T, b: T) => number): void {\n    if (this._multiple && this.selected) {\n      this._selected!.sort(predicate);\n    }\n  }\n\n  /**\n   * Gets whether multiple values can be selected.\n   */\n  isMultipleSelection() {\n    return this._multiple;\n  }\n\n  /** Selects an array of values. */\n  private _select(values: T[]) {\n    this._verifyValueAssignment(values);\n    values.forEach(value => this._markSelected(value));\n    const changed = this._hasQueuedChanges();\n    this._emitChangeEvent();\n    return changed;\n  }\n\n  /** Deselects an array of values. */\n  private _deselect(values: T[]) {\n    this._verifyValueAssignment(values);\n    values.forEach(value => this._unmarkSelected(value));\n    const changed = this._hasQueuedChanges();\n    this._emitChangeEvent();\n    return changed;\n  }\n\n  /** Sets the current selection from an array of items. */\n  private _setSelection(values: T[]) {\n    this._verifyValueAssignment(values);\n    const oldValues = this.selected;\n    const newSelectedSet = new Set(values.map(value => this._getConcreteValue(value)));\n    values.forEach(value => this._markSelected(value));\n    oldValues\n      .filter(value => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet)))\n      .forEach(value => this._unmarkSelected(value));\n    const changed = this._hasQueuedChanges();\n    this._emitChangeEvent();\n    return changed;\n  }\n\n  /** Emits a change event and clears the records of selected and deselected values. */\n  private _emitChangeEvent() {\n    // Clear the selected values so they can be re-cached.\n    this._selected = null;\n\n    if (this._selectedToEmit.length || this._deselectedToEmit.length) {\n      this.changed.next({\n        source: this,\n        added: this._selectedToEmit,\n        removed: this._deselectedToEmit,\n      });\n\n      this._deselectedToEmit = [];\n      this._selectedToEmit = [];\n    }\n  }\n\n  /** Selects a value. */\n  private _markSelected(value: T) {\n    value = this._getConcreteValue(value);\n    if (!this.isSelected(value)) {\n      if (!this._multiple) {\n        this._unmarkAll();\n      }\n\n      if (!this.isSelected(value)) {\n        this._selection.add(value);\n      }\n\n      if (this._emitChanges) {\n        this._selectedToEmit.push(value);\n      }\n    }\n  }\n\n  /** Deselects a value. */\n  private _unmarkSelected(value: T) {\n    value = this._getConcreteValue(value);\n    if (this.isSelected(value)) {\n      this._selection.delete(value);\n\n      if (this._emitChanges) {\n        this._deselectedToEmit.push(value);\n      }\n    }\n  }\n\n  /** Clears out the selected values. */\n  private _unmarkAll() {\n    if (!this.isEmpty()) {\n      this._selection.forEach(value => this._unmarkSelected(value));\n    }\n  }\n\n  /**\n   * Verifies the value assignment and throws an error if the specified value array is\n   * including multiple values while the selection model is not supporting multiple values.\n   */\n  private _verifyValueAssignment(values: T[]) {\n    if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw getMultipleValuesInSingleSelectionError();\n    }\n  }\n\n  /** Whether there are queued up change to be emitted. */\n  private _hasQueuedChanges() {\n    return !!(this._deselectedToEmit.length || this._selectedToEmit.length);\n  }\n\n  /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */\n  private _getConcreteValue(inputValue: T, selection?: Set<T>): T {\n    if (!this.compareWith) {\n      return inputValue;\n    } else {\n      selection = selection ?? this._selection;\n      for (let selectedValue of selection) {\n        if (this.compareWith!(inputValue, selectedValue)) {\n          return selectedValue;\n        }\n      }\n      return inputValue;\n    }\n  }\n}\n\n/**\n * Event emitted when the value of a MatSelectionModel has changed.\n * @docs-private\n */\nexport interface SelectionChange<T> {\n  /** Model that dispatched the event. */\n  source: SelectionModel<T>;\n  /** Options that were added to the model. */\n  added: T[];\n  /** Options that were removed from the model. */\n  removed: T[];\n}\n\n/**\n * Returns an error that reports that multiple values are passed into a selection model\n * with a single value.\n * @docs-private\n */\nexport function getMultipleValuesInSingleSelectionError() {\n  return Error('Cannot pass multiple values into SelectionModel with single-value mode.');\n}\n"],"names":["SelectionModel","_multiple","_emitChanges","compareWith","_selection","Set","_deselectedToEmit","_selectedToEmit","_selected","selected","Array","from","values","changed","Subject","bulk","select","_select","deselect","_deselect","setSelection","_setSelection","constructor","initiallySelectedValues","length","forEach","value","_markSelected","toggle","isSelected","clear","flushEvent","_unmarkAll","_hasQueuedChanges","_emitChangeEvent","has","_getConcreteValue","isEmpty","size","hasValue","sort","predicate","isMultipleSelection","_verifyValueAssignment","_unmarkSelected","oldValues","newSelectedSet","map","filter","next","source","added","removed","add","push","delete","ngDevMode","getMultipleValuesInSingleSelectionError","inputValue","selection","selectedValue","Error"],"mappings":"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"}