func (ix *IdxView) DeleteInvalid() {
	if ix.Table == nil || ix.Table.Rows <= 0 {
		ix.Idxs = nil
		return
	}
	ni := ix.Len()
	for i := ni - 1; i >= 0; i-- {
		if ix.Idxs[i] >= ix.Table.Rows {
			ix.Idxs = append(ix.Idxs[:i], ix.Idxs[i+1:]...)
		}
	}
}
DeleteInvalid deletes all invalid indexes from the list.
Call this if rows (could) have been deleted from table.
package etable
import (
	"fmt"
	"log"
	"math"
	"math/rand"
	"sort"
	"strings"
	"github.com/emer/etable/etensor"
	"github.com/goki/ki/ki"
	"github.com/goki/ki/kit"
	"github.com/goki/ki/sliceclone"
)
type LessFunc func(et *Table, i, j int) bool
type FilterFunc func(et *Table, row int) bool
type IdxView struct {
	Table    *Table   `desc:"Table that we are an indexed view onto"`
	Idxs     []int    `desc:"current indexes into Table"`
	lessFunc LessFunc `copy:"-" view:"-" xml:"-" json:"-" desc:"current Less function used in sorting"`
}
var KiT_IdxView = kit.Types.AddType(&IdxView{}, IdxViewProps)
func NewIdxView(et *Table) *IdxView {
	ix := &IdxView{}
	ix.SetTable(et)
	return ix
}
func (ix *IdxView) SetTable(et *Table) {
	ix.Table = et
	ix.Sequential()
}