text: "use strict";
  
  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  exports.default = removeTypeDuplicates;
  
  var _generated = require("../../validators/generated");
  
  function removeTypeDuplicates(nodes) {
    const generics = {};
    const bases = {};
    const typeGroups = [];
    const types = [];
  
    for (let i = 0; i < nodes.length; i++) {
      const node = nodes[i];
      if (!node) continue;
  
      if (types.indexOf(node) >= 0) {
        continue;
      }
  
      if ((0, _generated.isAnyTypeAnnotation)(node)) {
        return [node];
      }
  
      if ((0, _generated.isFlowBaseAnnotation)(node)) {
        bases[node.type] = node;
        continue;
      }
  
      if ((0, _generated.isUnionTypeAnnotation)(node)) {
        if (typeGroups.indexOf(node.types) < 0) {
          nodes = nodes.concat(node.types);
          typeGroups.push(node.types);
        }
  
        continue;
      }
  
      if ((0, _generated.isGenericTypeAnnotation)(node)) {
        const name = node.id.name;
  
        if (generics[name]) {
          let existing = generics[name];
  
          if (existing.typeParameters) {
            if (node.typeParameters) {
              existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params.concat(node.typeParameters.params));
            }
          } else {
            existing = node.typeParameters;
          }
        } else {
          generics[name] = node;
        }
  
        continue;
      }
  
      types.push(node);
    }
  
    for (const type of Object.keys(bases)) {
      types.push(bases[type]);
    }
  
    for (const name of Object.keys(generics)) {
      types.push(generics[name]);
    }
  
    return types;
  }