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 }