setStyles = (structure, styles, oldStyles) => {
  if ( styles === void 0 ) styles = {};
  if ( oldStyles === void 0 ) oldStyles = {};

  if (!structure.html || !structure.html[0]) { return styles; }
  var element = structure.html[0];

  // Handle Listeners
  if (styles instanceof Listener) {
    if (typeof structure.$styleListeners.general !== 'undefined') {
      return element.style;
    }
    structure.$styleListeners.general = styles;
    structure.$styleListeners.general.applyDepth(structure.depth).init();

    structure.$styleListeners.general.onValueChange(value => {
      setStyles(structure, value, {});
    });

    return element.style;
  }

  if (typeof styles === 'string') {
    element.style = styles;
    return element.style;
  }

  var toRemove = Object.keys(oldStyles)
    .filter(key => typeof styles[key] === 'undefined');

  var loop = function ( style ) {
    if (styles.hasOwnProperty(style)) {
      // Skip if styles are the same
      if (typeof oldStyles !== 'undefined' && oldStyles[style] === styles[style]) { return; }

      // Need to remove falsy style
      if (!styles[style] && typeof styles[style] !== 'number') {
        element.style[style] = null;
        return;
      }

      // Handle Listeners
      if (styles[style] instanceof Listener) {
        if (typeof structure.$styleListeners[style] !== 'undefined') { return; }
        structure.$styleListeners[style] = styles[style];
        structure.$styleListeners[style].applyDepth(structure.depth).init();

        structure.$styleListeners[style].onValueChange(value => {
          setStyles(structure, {
            [style]: value,
          }, {});
        });

        styles[style] = structure.$styleListeners[style].value;
        return;
      }

      element.style[style] = parseValue(styles[style]);
    }
  };

  for (var style in styles) loop( style );

  for (var i = 0; i < toRemove.length; i++) {
    element.style[toRemove[i]] = null;
  }

  return element.style;
}
@param {Structure} structure
@param {object} styles
@param {object} oldStyles
@returns {object}