docs: public byte type() {
      if( _naCnt == -1 ) {        // No rollups yet?
        int nas=0, ss=0, nzs=0;
        if( _ds != null && _ls != null ) { // UUID?
          for( int i=0; i<_sparseLen; i++ )
            if( _xs != null && _xs[i]==Integer.MIN_VALUE )  nas++;
            else if( _ds[i] !=0 || _ls[i] != 0 ) nzs++;
          _uuidCnt = _len-nas;
        } else if( _ds != null ) { // Doubles?
          assert _xs==null;
          for( int i = 0; i < _sparseLen; ++i) if( Double.isNaN(_ds[i]) ) nas++; else if( _ds[i]!=0 ) nzs++;
        } else {                  // Longs and enums?
          if( _ls != null )
            for( int i=0; i<_sparseLen; i++ )
              if( isNA2(i) ) nas++;
              else {
                if( isEnum2(i)   ) ss++;
                if( _ls[i] != 0 ) nzs++;
              }
        }
        _nzCnt=nzs;  _strCnt=ss;  _naCnt=nas;
      }
      // Now run heuristic for type
      if(_naCnt == _len)          // All NAs ==> NA Chunk
        return AppendableVec.NA;
      if(_strCnt > 0 && _strCnt + _naCnt == _len)
        return AppendableVec.ENUM; // All are Strings+NAs ==> Enum Chunk
      // UUIDs?
      if( _uuidCnt > 0 ) return AppendableVec.UUID;
      // Larger of time & numbers
      int timCnt=0; for( int t : _timCnt ) timCnt+=t;
      int nums = _len-_naCnt-timCnt;
      return timCnt >= nums ? AppendableVec.TIME : AppendableVec.NUMBER;
    }