func SliceFilter(filter Filter) Filter {
	return FilterFunc(func(k string, v interface{}) interface{} {
		r := reflect.ValueOf(v)
		if r.Kind() == reflect.Slice {
			res := make([]interface{}, 0, r.Len())
			for i := 0; i < r.Len(); i++ {
				el := r.Index(i).Interface()
				res = append(res, filter.Filter(k, el))
			}

			return res
		}

		return filter.Filter(k, v)
	})
}
func SliceFilter(filter Filter) Filter {
	return FilterFunc(func(k string, v interface{}) interface{} {
		r := reflect.ValueOf(v)
		if r.Kind() == reflect.Slice {
			res := make([]interface{}, 0, r.Len())
			for i := 0; i < r.Len(); i++ {
				el := r.Index(i).Interface()
				res = append(res, filter.Filter(k, el))
			}

			return res
		}

		return filter.Filter(k, v)
	})
}
// SliceFilter lifts the filter to also work on slices. It loses the
// type information of the slice elements