"use strict";

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

(function (f) {
  if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") {
    module.exports = f();
  } else if (typeof define === "function" && define.amd) {
    define([], f);
  } else {
    var g;if (typeof window !== "undefined") {
      g = window;
    } else if (typeof global !== "undefined") {
      g = global;
    } else if (typeof self !== "undefined") {
      g = self;
    } else {
      g = this;
    }g.snabbdom_eventlisteners = f();
  }
})(function () {
  var define, module, exports;return function e(t, n, r) {
    function s(o, u) {
      if (!n[o]) {
        if (!t[o]) {
          var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw f.code = "MODULE_NOT_FOUND", f;
        }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {
          var n = t[o][1][e];return s(n ? n : e);
        }, l, l.exports, e, t, n, r);
      }return n[o].exports;
    }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) {
      s(r[o]);
    }return s;
  }({ 1: [function (require, module, exports) {
      module.exports = {
        array: Array.isArray,
        primitive: function primitive(s) {
          return typeof s === 'string' || typeof s === 'number';
        }
      };
    }, {}], 2: [function (require, module, exports) {
      var is = require('../is');

      function arrInvoker(arr) {
        return function () {
          if (!arr.length) return;
          // Special case when length is two, for performance
          arr.length === 2 ? arr[0](arr[1]) : arr[0].apply(undefined, arr.slice(1));
        };
      }

      function fnInvoker(o) {
        return function (ev) {
          if (o.fn === null) return;
          o.fn(ev);
        };
      }

      function updateEventListeners(oldVnode, vnode) {
        var name,
            cur,
            old,
            elm = vnode.elm,
            oldOn = oldVnode.data.on || {},
            on = vnode.data.on;
        if (!on) return;
        for (name in on) {
          cur = on[name];
          old = oldOn[name];
          if (old === undefined) {
            if (is.array(cur)) {
              elm.addEventListener(name, arrInvoker(cur));
            } else {
              cur = { fn: cur };
              on[name] = cur;
              elm.addEventListener(name, fnInvoker(cur));
            }
          } else if (is.array(old)) {
            // Deliberately modify old array since it's captured in closure created with `arrInvoker`
            old.length = cur.length;
            for (var i = 0; i < old.length; ++i) {
              old[i] = cur[i];
            }on[name] = old;
          } else {
            old.fn = cur;
            on[name] = old;
          }
        }
        if (oldOn) {
          for (name in oldOn) {
            if (on[name] === undefined) {
              var old = oldOn[name];
              if (is.array(old)) {
                old.length = 0;
              } else {
                old.fn = null;
              }
            }
          }
        }
      }

      module.exports = { create: updateEventListeners, update: updateEventListeners };
    }, { "../is": 1 }] }, {}, [2])(2);
});