whole_func_string: function addFeatures(state, action) {
    const source = state.sources[action.sourceName];
    if (!source) {
      return state;
    }
    const data = source.data;
  
    // placeholder for the new data
    let new_data = null;
    let features;
    if (action.features.features) {
      // When a full geoJson object is passed in, check the projection
      features = reprojectGeoJson(action.features);
    } else {
      // Pass along an just features
      features = action.features;
    }
  
    // when there is no data, use the data
    // from the action.
    if (!data || !data.type) {
      // coerce this to a FeatureCollection.
      new_data = {
        type: 'FeatureCollection',
        features,
      };
    } else if (data.type === 'Feature') {
      new_data = {
        type: 'FeatureCollection',
        features: [data].concat(features),
      };
    } else if (data.type === 'FeatureCollection') {
      let featureCollection = [];
  
      if (action.position > -1) {
        for (let i = 0, ii = data.features.length; i < ii; i++) {
          if (i === action.position) {
            for (let x = 0, xx = features.length; x < xx; x++) {
              featureCollection.push(features[x]);
            }
          }
          featureCollection.push(data.features[i]);
        }
      } else {
        featureCollection = data.features.concat(features);
      }
      new_data = Object.assign({}, data, {features: featureCollection});
    }
  
    if (new_data !== null) {
      return changeData(state, action.sourceName, new_data);
    }
    return state;
  }
func_code_string: function addFeatures(state, action) {
    const source = state.sources[action.sourceName];
    if (!source) {
      return state;
    }
    const data = source.data;
  
    // placeholder for the new data
    let new_data = null;
    let features;
    if (action.features.features) {
      // When a full geoJson object is passed in, check the projection
      features = reprojectGeoJson(action.features);
    } else {
      // Pass along an just features
      features = action.features;
    }
  
    // when there is no data, use the data
    // from the action.
    if (!data || !data.type) {
      // coerce this to a FeatureCollection.
      new_data = {
        type: 'FeatureCollection',
        features,
      };
    } else if (data.type === 'Feature') {
      new_data = {
        type: 'FeatureCollection',
        features: [data].concat(features),
      };
    } else if (data.type === 'FeatureCollection') {
      let featureCollection = [];
  
      if (action.position > -1) {
        for (let i = 0, ii = data.features.length; i < ii; i++) {
          if (i === action.position) {
            for (let x = 0, xx = features.length; x < xx; x++) {
              featureCollection.push(features[x]);
            }
          }
          featureCollection.push(data.features[i]);
        }
      } else {
        featureCollection = data.features.concat(features);
      }
      new_data = Object.assign({}, data, {features: featureCollection});
    }
  
    if (new_data !== null) {
      return changeData(state, action.sourceName, new_data);
    }
    return state;
  }
func_documentation_string: Add features to a source.
  @param {Object} state Current state.
  @param {Object} action Action to handle.
  
  @returns {Object} The new state.