#

API Docs for: v2.11.1
Show: Inherited Protected Private Deprecated

# File: packages/ember-runtime/lib/mixins/mutable_enumerable.js

    import Enumerable from './enumerable';
    import {
      Mixin,
      beginPropertyChanges,
      endPropertyChanges
    } from 'ember-metal';

    /**
    @module ember
    @submodule ember-runtime
    */

    /**
      This mixin defines the API for modifying generic enumerables. These methods
      can be applied to an object regardless of whether it is ordered or
      unordered.

      Note that an Enumerable can change even if it does not implement this mixin.
      For example, a MappedEnumerable cannot be directly modified but if its
      underlying enumerable changes, it will change also.

      ## Adding Objects

      To add an object to an enumerable, use the `addObject()` method. This
      method will only add the object to the enumerable if the object is not
      already present and is of a type supported by the enumerable.

      ```javascript
      set.addObject(contact);
      ```

      ## Removing Objects

      To remove an object from an enumerable, use the `removeObject()` method. This
      will only remove the object if it is present in the enumerable, otherwise
      this method has no effect.

      ```javascript
      set.removeObject(contact);
      ```

      ## Implementing In Your Own Code

      If you are implementing an object and want to support this API, just include
      this mixin in your class and implement the required methods. In your unit
      tests, be sure to apply the Ember.MutableEnumerableTests to your object.

      @class MutableEnumerable
      @namespace Ember
      @uses Ember.Enumerable
      @public
    */
    export default Mixin.create(Enumerable, {

      /**
        __Required.__ You must implement this method to apply this mixin.

        Attempts to add the passed object to the receiver if the object is not
        already present in the collection. If the object is present, this method
        has no effect.

        If the passed object is of a type not supported by the receiver,
        then this method should raise an exception.

        @method addObject
        @param {Object} object The object to add to the enumerable.
        @return {Object} the passed object
        @public
      */
      addObject: null,

      /**
        Adds each object in the passed enumerable to the receiver.

        @method addObjects
        @param {Ember.Enumerable} objects the objects to add.
        @return {Object} receiver
        @public
      */
      addObjects(objects) {
        beginPropertyChanges(this);
        objects.forEach(obj => this.addObject(obj));
        endPropertyChanges(this);
        return this;
      },

      /**
        __Required.__ You must implement this method to apply this mixin.

        Attempts to remove the passed object from the receiver collection if the
        object is present in the collection. If the object is not present,
        this method has no effect.

        If the passed object is of a type not supported by the receiver,
        then this method should raise an exception.

        @method removeObject
        @param {Object} object The object to remove from the enumerable.
        @return {Object} the passed object
        @public
      */
      removeObject: null,

      /**
        Removes each object in the passed enumerable from the receiver.

        @method removeObjects
        @param {Ember.Enumerable} objects the objects to remove
        @return {Object} receiver
        @public
      */
      removeObjects(objects) {
        beginPropertyChanges(this);
        for (let i = objects.length - 1; i >= 0; i--) {
          this.removeObject(objects[i]);
        }
        endPropertyChanges(this);
        return this;
      }
    });