function classnames(...args) {
  const result = [];

  args.filter(Boolean).forEach((it) => {
    if (isArray(it)) {
      result.push(classnames(...it));
    } else if (isObject(it)) {
      Object.keys(it)
        .filter((k) => Boolean(it[k]))
        .forEach((key) => {
          result.push(key);
        });
    } else if (isString(it)) {
      result.push(it);
    }
  });

  return result.join(" ");
}
classnames('a', 'b') => 'a b'
classnames('a', {'b': false}) => 'a'
classnames('a', {'b': true}) => 'a b'
classnames('a', {'b': true, 'c': false}) => 'a b'
classnames('a', {'b': true, 'c': true}) => 'a b c'
classnames('a', ['10', 'value', { yellow: true }],{'b': true, 'c': true, 'd': 'foo'}) => 'a 10 value yellow b c d'

@param  {...(string|object)} args
@returns