123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package help
- // Intersect produces the set intersection of the source collection and the
- // provided input collection. The intersection of two sets A and B is defined as
- // the set that contains all the elements of A that also appear in B, but no
- // other elements.
- func (q Query) Intersect(q2 Query) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- next2 := q2.Iterate()
- set := make(map[interface{}]bool)
- for item, ok := next2(); ok; item, ok = next2() {
- set[item] = true
- }
- return func() (item interface{}, ok bool) {
- for item, ok = next(); ok; item, ok = next() {
- if _, has := set[item]; has {
- delete(set, item)
- return
- }
- }
- return
- }
- },
- }
- }
- // IntersectBy produces the set intersection of the source collection and the
- // provided input collection. The intersection of two sets A and B is defined as
- // the set that contains all the elements of A that also appear in B, but no
- // other elements.
- //
- // IntersectBy invokes a transform function on each element of both collections.
- func (q Query) IntersectBy(q2 Query,
- selector func(interface{}) interface{}) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- next2 := q2.Iterate()
- set := make(map[interface{}]bool)
- for item, ok := next2(); ok; item, ok = next2() {
- s := selector(item)
- set[s] = true
- }
- return func() (item interface{}, ok bool) {
- for item, ok = next(); ok; item, ok = next() {
- s := selector(item)
- if _, has := set[s]; has {
- delete(set, s)
- return
- }
- }
- return
- }
- },
- }
- }
- // IntersectByT is the typed version of IntersectBy.
- //
- // - selectorFn is of type "func(TSource) TSource"
- //
- // NOTE: IntersectBy has better performance than IntersectByT.
- func (q Query) IntersectByT(q2 Query,
- selectorFn interface{}) Query {
- selectorGenericFunc, err := newGenericFunc(
- "IntersectByT", "selectorFn", selectorFn,
- simpleParamValidator(newElemTypeSlice(new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- selectorFunc := func(item interface{}) interface{} {
- return selectorGenericFunc.Call(item)
- }
- return q.IntersectBy(q2, selectorFunc)
- }
|