code: function typeOf (rule) {
    var ruleType = typeof rule
    
    return ruleType === 'function'
      ? ruleType
      : ruleType !== 'object'
        ? (rule.length === 0
            ? 'noop'
            : (rule === 0
                ? 'zero'
                : ruleType
              )
          )
        : Buffer.isBuffer(rule)
          ? 'buffer'
          : !isArray(rule)
            ? ((has(rule, 'start') && has(rule, 'end')
                ? 'range'
                : has(rule, 'start')
                  ? 'rangestart'
                  : has(rule, 'end')
                    ? 'rangeend'
                    : has(rule, 'firstOf')
                      ? (( (isArray(rule.firstOf) && sameTypeArray(rule.firstOf) )
                          || typeof rule.firstOf === 'string'
                          )
                        && rule.firstOf.length > 1
                        )
                          ? 'firstof'
                          : 'invalid firstof'
                      : 'invalid'
                )
                + '_object'
              )
            : !sameTypeArray(rule)
              ? 'multi types array'
              : ((Buffer.isBuffer( rule[0] )
                  ? 'buffer'
                  : typeof rule[0]
                  )
                  + '_array'
                )
  }
docs: Return the type of an item
  @param {...} item to check
  @return {String} type