simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

assign.js (1685B)


      1 import { errorTransform } from '../../transform/utils/errorTransform.js';
      2 import { setSafeProperty } from '../../../utils/customs.js';
      3 export function assignFactory(_ref) {
      4   var {
      5     subset,
      6     matrix
      7   } = _ref;
      8 
      9   /**
     10    * Replace part of an object:
     11    *
     12    * - Assign a property to an object
     13    * - Replace a part of a string
     14    * - Replace a matrix subset
     15    *
     16    * @param {Object | Array | Matrix | string} object
     17    * @param {Index} index
     18    * @param {*} value
     19    * @return {Object | Array | Matrix | string} Returns the original object
     20    *                                            except in case of a string
     21    */
     22   // TODO: change assign to return the value instead of the object
     23   return function assign(object, index, value) {
     24     try {
     25       if (Array.isArray(object)) {
     26         // we use matrix.subset here instead of the function subset because we must not clone the contents
     27         return matrix(object).subset(index, value).valueOf();
     28       } else if (object && typeof object.subset === 'function') {
     29         // Matrix
     30         return object.subset(index, value);
     31       } else if (typeof object === 'string') {
     32         // TODO: move setStringSubset into a separate util file, use that
     33         return subset(object, index, value);
     34       } else if (typeof object === 'object') {
     35         if (!index.isObjectProperty()) {
     36           throw TypeError('Cannot apply a numeric index as object property');
     37         }
     38 
     39         setSafeProperty(object, index.getObjectProperty(), value);
     40         return object;
     41       } else {
     42         throw new TypeError('Cannot apply index: unsupported type of object');
     43       }
     44     } catch (err) {
     45       throw errorTransform(err);
     46     }
     47   };
     48 }