package engine type Stack []*Card func (s Stack) Contains(predicate func(c IsCard) bool) bool { for _, c := range s { if predicate(c) { return true } } return false } func (s Stack) Filter(predicate func(c IsCard) bool) Stack { res := make(Stack, 0, len(s)) for _, c := range s { if predicate(c) { res = append(res, c) } } return res }