code: func and(groups []Group) []Group {
  	op := &andOperation{stack: &stack{}}
  	op.and(groups, 0)
  	return op.result
  }
docs: // and performs an 'and' operation of the given set of groups
  // For example, given the set of groups, G=[(A,B),(C,D)],
  // then and(G) = [(A,C),(A,D),(B,C),(B,D)]