Source: styles/unique.js

let ol = require('openlayers');
let AbstractStyle = require('./abstract');
let UniformStyle = require('./uniform');
let SymbolFabric = require('./../symbols/symbolFabric');
let LegendItem = require('./legendItem');
let mem = require('mem');

/**
 * Класс UniqueStyle создает стиль, основанный на частных значениях
 * @extends AbstractStyle
 */
class UniqueStyle extends AbstractStyle {
   /**
    * Создает экземпляр стиля типа UniqueStyle
    * @param params
    */
   constructor(params) {
      super(params);
      this.type = "unique";
      this.geometryType = params.geometryType;
      this.params = params;
      this.field = params.field;
      this.styles = this.create(params);
      this.styleDefault = this.createDefault(params);
      this.memoize = {};
   }

   getStyle() {
      let field = this.field;
      let styles = this.styles;
      let styleDefault = this.styleDefault;
      let params = this.params;
      let memoize = this.memoize;

      const styleFunction = function (feature, resolution) {
         let style = styleDefault.style;
         let classify;
         try {
            classify = feature.get(field);
            if (memoize[classify]) return memoize[classify];

            if (classify) {
               style = styles[classify].style;
               style.setText(SymbolFabric().text(params, feature));
            }
         }
         catch (e) {
            style = styleDefault.style;
            style.setText(SymbolFabric().text(params, feature));
         }
         memoize[classify] = style;
         return style;
      };
      return styleFunction;
   }

   setStyle(style) {
      this.styles = style;
   }

   styleArray() {
      let self = this;
      let params = self.params;
      let geometryType = self.geometryType || super.testGeometry(params);
      let styles = [];
      let field = self.field;

      let index = 0;
      let defaultProperties = {};
      defaultProperties[field] = undefined;
      let defaultLegendItem = new LegendItem({
         index: index,
         field: field,
         value: undefined,
         properties: defaultProperties,
         style: self.styleDefault,
         geometryType: geometryType
      });

      styles.push(defaultLegendItem);

      for (let value in params.values) {
         let properties = {};
         properties[field] = value;
         let label = field + "=" + value;
         let valueLegendItem = new LegendItem({
            index: ++index,
            properties: properties,
            label: label,
            style: params.values[value],
            geometryType: geometryType
         });
         styles.push(valueLegendItem);

      }
      return styles;
   }

   legend() {
      return this.styleArray();
   }

   create(params) {
      let styleContainer = {};
      let styleParameters = params.values;
      for (let key in styleParameters) {
         styleContainer[key] = new UniformStyle(styleParameters[key])
      }
      return styleContainer;
   }

   createDefault(params) {
      let styleParameters = params.default;
      return new UniformStyle(styleParameters);
   }
}

module.exports = UniqueStyle;