package spec_iterator import "github.com/onsi/ginkgo/internal/spec" type ShardedParallelIterator struct { specs []*spec.Spec index int maxIndex int } func NewShardedParallelIterator(specs []*spec.Spec, total int, node int) *ShardedParallelIterator { startIndex, count := ParallelizedIndexRange(len(specs), total, node) return &ShardedParallelIterator{ specs: specs, index: startIndex, maxIndex: startIndex + count, } } func (s *ShardedParallelIterator) Next() (*spec.Spec, error) { if s.index >= s.maxIndex { return nil, ErrClosed } spec := s.specs[s.index] s.index += 1 return spec, nil } func (s *ShardedParallelIterator) NumberOfSpecsPriorToIteration() int { return len(s.specs) } func (s *ShardedParallelIterator) NumberOfSpecsToProcessIfKnown() (int, bool) { return s.maxIndex - s.index, true } func (s *ShardedParallelIterator) NumberOfSpecsThatWillBeRunIfKnown() (int, bool) { count := 0 for i := s.index; i < s.maxIndex; i += 1 { if !s.specs[i].Skipped() && !s.specs[i].Pending() { count += 1 } } return count, true }