package strain type Ints []int func (i Ints) Keep(f func(int) bool) Ints { r := Ints{} for _, v := range i { if f(v) { r = append(r, v) } } if len(r) == 0 { return nil } return r } func (i Ints) Discard(f func(int) bool) Ints { r := Ints{} for _, v := range i { if !f(v) { r = append(r, v) } } if len(r) == 0 { return nil } return r } type Lists [][]int func (l Lists) Keep(f func([]int) bool) Lists { r := Lists{} for _, v := range l { if f(v) { r = append(r, v) } } if len(r) == 0 { return nil } return r } type Strings []string func (s Strings) Keep(f func(string) bool) Strings { r := Strings{} for _, v := range s { if f(v) { r = append(r, v) } } if len(r) == 0 { return nil } return r }