github.com/searKing/golang/go@v1.2.74/util/spliterator/delegating_spliterator.go (about)

     1  // Copyright 2020 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package spliterator
     6  
     7  import (
     8  	"context"
     9  
    10  	"github.com/searKing/golang/go/util/function/consumer"
    11  	"github.com/searKing/golang/go/util/function/supplier"
    12  	"github.com/searKing/golang/go/util/object"
    13  )
    14  
    15  /**
    16   * Spliterator implementation that delegates to an underlying spliterator,
    17   * acquiring the spliterator from a {@code Supplier<Spliterator>} on the
    18   * first call to any spliterator method.
    19   * @param <T>
    20   */
    21  type delegatingSpliterator struct {
    22  	supplier supplier.Supplier
    23  	// The underlying spliterator
    24  	s Spliterator
    25  }
    26  
    27  func NewDelegatingSpliterator(supplier supplier.Supplier) Spliterator {
    28  	return &delegatingSpliterator{
    29  		supplier: supplier,
    30  	}
    31  }
    32  
    33  func (split *delegatingSpliterator) get() Spliterator {
    34  	if split == nil {
    35  		split.s = split.supplier.Get().(Spliterator)
    36  	}
    37  	return split.s
    38  }
    39  
    40  func (split *delegatingSpliterator) TrySplit() Spliterator {
    41  	return split.get().TrySplit()
    42  }
    43  
    44  func (split *delegatingSpliterator) TryAdvance(ctx context.Context, consumer consumer.Consumer) bool {
    45  	return split.get().TryAdvance(ctx, consumer)
    46  }
    47  
    48  func (split *delegatingSpliterator) ForEachRemaining(ctx context.Context, consumer consumer.Consumer) {
    49  	split.get().ForEachRemaining(ctx, consumer)
    50  }
    51  
    52  func (split *delegatingSpliterator) EstimateSize() int {
    53  	return split.get().EstimateSize()
    54  }
    55  
    56  func (split *delegatingSpliterator) GetExactSizeIfKnown() int {
    57  	return split.get().GetExactSizeIfKnown()
    58  }
    59  
    60  func (split *delegatingSpliterator) Characteristics() Characteristic {
    61  	return split.get().Characteristics()
    62  }
    63  
    64  func (split *delegatingSpliterator) HasCharacteristics(characteristics Characteristic) bool {
    65  	return split.get().HasCharacteristics(characteristics)
    66  }
    67  
    68  func (split *delegatingSpliterator) GetComparator() object.Comparator {
    69  	return split.get().GetComparator()
    70  }