anchor.diff:    removeAt(int index) => _srcList.removeAt(index);
   
     removeLast() => _srcList.removeLast();
  -  void removeWhere(bool test( element))=> _srcList.removeWhere(test);
  +  void removeWhere(bool test(element)) => _srcList.removeWhere(test);
   
     void retainWhere(bool test(element)) => retainWhere(test);
  -  List sublist(int start, [int end]) => _srcList.sublist(start,end);
  -  Iterable getRange(int start, int end) => _srcList.getRange(start,end);
  -
  -  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) => _srcList.setRange(start, end, iterable, skipCount);
  -  void removeRange(int start, int end) => _srcList.removeRange(start,end);
  +  List sublist(int start, [int end]) => _srcList.sublist(start, end);
  +  Iterable getRange(int start, int end) => _srcList.getRange(start, end);
  +
  +  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) =>
  +      _srcList.setRange(start, end, iterable, skipCount);
  +  void removeRange(int start, int end) => _srcList.removeRange(start, end);
     void fillRange(int start, int end, [fillValue]) => _srcList.fillRange(start, end, fillValue);
     void replaceRange(int start, int end, Iterable replacement) => _srcList.replaceRange(start, end, replacement);
     Map asMap() => _srcList.asMap();
  
positive.code: 
    int indexOf(element, [int start = 0]) => _srcList.indexOf(element, start);
    int lastIndexOf(element, [int start]) => _srcList.lastIndexOf(element, start);
    void insert(int index,  element) => _srcList.insert(index, element);
  
    void insertAll(int index, Iterable iterable) => _srcList.insertAll(index, iterable);
  
  
negative.code:    * [collapsedField] field describe collapsed(true) or expand(false)
     * [items] List of row
     */
    factory HierarchFilterList.withKeyField(
        [String parentField = '_parent', String idField = 'id', String collapsedField = '_collapsed', List items]) {
      HierarchFilterList hier = new HierarchFilterList._(items);
      hier._parentField = parentField;
      hier._idField = idField;
      hier._collapsedField = collapsedField;
      return hier;
    }
  
    _foldHelper() {
      Map tMap = {'parents': new Set(), 'list': []};
      return new UnmodifiableListView(_srcList.fold(tMap, (Map init, val) {
        //_filter.keys.every(test)
        bool showRow = _filter.keys.every((k) {
          if (k == _collapsedField) {
            //filter by tree hierarchical
            if (init['parents'].contains(val[_parentField])) {
              init['parents'].add(val[_idField]);
              return false;
            } else if (val[k] == true) {
              init['parents'].add(val[_idField]);
              return true;
            } else {
              return true;
            }
          } else if (_filter[k] is Function) {
            bool isShow = _filter[k](val[k]);
            if (!isShow) init['parents'].add(val[_idField]);
            return isShow;
          } else {
            return true;
          }
        });
        if (showRow) init['list'].add(val);
        return init;
      })['list']);
    }
  }
  
  /**
   * meta data interface for data
   * Meta data is a list wrappper that provide getMetaData when need override style in row rendering
   */
  abstract class IMetaData {
    Map getMetaData(int rowId);
    void setMetaData(Function metaFunc);
  }
  
  class MetaList<T> extends ListBase<T> with IMetaData {
    Function _func;
    List<T> innerList;
    MetaList(this.innerList, [this._func]) {}
  
    Map getMetaData(int rowId) {
      return _func(rowId);
    }
  
    void setMetaData(_) => _func = _;
  
    int get length => innerList.length;
  
    void set length(int length) {
      innerList.length = length;
    }
  
    void operator []=(int index, T value) {
      innerList[index] = value;
    }
  
    T operator [](int index) => innerList[index];
  
    // Though not strictly necessary, for performance reasons
  