/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . apache . t inker pop 4 . gre mlin . util . iterator Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . process . traversal . util . Fast NoSuch ElementException Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Collection Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Comparator Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . HashSet Ċ import Ġjava . util . Iterator Ċ import Ġjava . util . List Ċ import Ġjava . util . Map Ċ import Ġjava . util . Set Ċ import Ġjava . util . Spl iterator Ċ import Ġjava . util . Spl iter ators Ċ import Ġjava . util . function . Bi Function Ċ import Ġjava . util . function . Binary Operator Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . function . Predicate Ċ import Ġjava . util . stream . Stream Ċ import Ġjava . util . stream . Stream Support Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ object ĠIterator Utils Ġ{ ĊĠĠĠ Ġfun Ġ< S > Ġof ( a : ĠS ): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle Iterator ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġof ( a : ĠS , Ġb : ĠS ): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDouble Iterator ( a , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////// ///// ĊĠĠĠ Ġfun Ġ< S Ġ: ĠCollection < T > ?, ĠT > Ġfill ( iterator : ĠIterator < T >, Ġcollection : ĠS ): ĠS Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . add ( iterator . next ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcollection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġiterate ( iterator : ĠIterator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount ( iterator : ĠIterator ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġix : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ ix ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount ( iterable : ĠIterable ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ( iterable . iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġlist ( iterator : ĠIterator < S >): ĠList < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfill ( iterator , ĠArrayList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġlist ( iterator : ĠIterator < S >, Ġcomparator : ĠComparator ?): ĠList < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl : ĠList < S > Ġ= Ġlist < Any >( iterator ) ĊĠĠĠĠĠĠĠ ĠCollections . sort ( l , Ġcomparator ) ĊĠĠĠĠĠĠĠ Ġreturn Ġl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġset ( iterator : ĠIterator < S >): ĠSet < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfill ( iterator , ĠHashSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġlimit ( iterator : ĠIterator < S >, Ġlimit : ĠInt ): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < S >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () Ġ&& Ġcount Ġ< Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count ++ Ġ>= Ġlimit ) Ġthrow ĠFast NoSuch ElementException . instance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// / ĊĠĠĠ Ġfun Ġ< T > Ġall Match ( iterator : ĠIterator < T >, Ġpredicate : ĠPredicate < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( iterator . next ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġany Match ( iterator : ĠIterator < T >, Ġpredicate : ĠPredicate < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate . test ( iterator . next ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnone Match ( iterator : ĠIterator < T >, Ġpredicate : ĠPredicate < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate . test ( iterator . next ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// / ĊĠĠĠ Ġfun Ġ< K , ĠS > Ġcollect Map ( iterator : ĠIterator < S >, Ġkey : ĠFunction < S , ĠK >): ĠMap < K , ĠS > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcollect Map ( iterator , Ġkey , ĠFunction . identity ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠS , ĠV > Ġcollect Map ( iterator : ĠIterator < S >, Ġkey : ĠFunction < S , ĠK >, Ġvalue : ĠFunction < S , ĠV >): ĠMap < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < K , ĠV > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( key . apply ( obj ), Ġvalue . apply ( obj )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠS > Ġgroup By ( iterator : ĠIterator < S >, Ġgroup By : ĠFunction < S , ĠK >): ĠMap < K , ĠList < S >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < K , ĠList < S >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . compute If Absent ( groupBy . apply ( obj )) Ġ{ Ġk Ġ-> ĠArrayList () Ġ}. add ( obj ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġreduce ( iterator : ĠIterator < S >, Ġidentity : ĠS , Ġaccumulator : ĠBinary Operator < S >): ĠS Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġidentity ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġaccumulator . apply ( result , Ġiterator . next ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġreduce ( iterable : ĠIterable < S >, Ġidentity : ĠS , Ġaccumulator : ĠBinary Operator < S >? ): ĠS Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreduce ( iterable . iterator (), Ġidentity , Ġaccumulator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġreduce ( iterator : ĠIterator < S >, Ġidentity : ĠE , Ġaccumulator : ĠBi Function < E , ĠS , ĠE >): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġidentity ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġaccumulator . apply ( result , Ġiterator . next ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġreduce ( iterable : ĠIterable < S >, Ġidentity : ĠE , Ġaccumulator : ĠBi Function < E , ĠS , ĠE >? ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreduce ( iterable . iterator (), Ġidentity , Ġaccumulator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////// ///// ĊĠĠĠ Ġfun Ġ< S > Ġconsume ( iterator : ĠIterator < S >, Ġconsumer : ĠConsumer < S >): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < S >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġconsume ( iterable : ĠIterable < S >, Ġconsumer : ĠConsumer < S >): ĠIterable < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIterable < S > Ġ{ Ġconsume ( iterable . iterator (), Ġconsumer ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////// ///// ĊĠĠĠ Ġfun Ġ< S , ĠE > Ġmap ( iterator : ĠIterator < S >, Ġfunction : ĠFunction < S , ĠE >): ĠIterator < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < E >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunction . apply ( iterator . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġmap ( iterable : ĠIterable < S >, Ġfunction : ĠFunction < S , ĠE >): ĠIterable < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIterable < E > Ġ{ Ġmap ( iterable . iterator (), Ġfunction ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////// ///// ĊĠĠĠ Ġfun Ġ< S > Ġfilter ( iterator : ĠIterator < S >, Ġpredicate : ĠPredicate < S >): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < S >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Result : ĠS ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ!= Ġnext Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ!= Ġnext Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġnext Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġnext Result ) Ġnext Result Ġelse Ġthrow ĠFast NoSuch ElementException . instance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Result Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadvance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Result Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate . test ( s )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Result Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S > Ġfilter ( iterable : ĠIterable < S >, Ġpredicate : ĠPredicate < S >): ĠIterable < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIterable < S > Ġ{ Ġfilter ( iterable . iterator (), Ġpredicate ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// / ĊĠĠĠ Ġfun Ġ< S , ĠE > Ġflat Map ( iterator : ĠIterator < S >, Ġfunction : ĠFunction < S , ĠIterator < E > ?> ): ĠIterator < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < E >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent Iterator : ĠIterator < E > Ġ= ĠCollections . empty Iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Iterator . hasNext ()) Ġreturn Ġtrue Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Iterator Ġ= Ġfunction . apply ( iterator . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Iterator . hasNext ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( hasNext ()) Ġcurrent Iterator . next () Ġelse Ġthrow ĠFast NoSuch ElementException . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// / ĊĠĠĠ Ġfun Ġ< S > Ġconcat ( var arg Ġiterators : ĠIterator < S >? ): ĠIterator < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator : ĠMulti Iterator < S > Ġ= ĠMulti Iterator () ĊĠĠĠĠĠĠĠ Ġfor Ġ( it ty Ġin Ġiterators ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . add Iterator ( it ty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiterator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// / ĊĠĠĠ Ġfun Ġas Iterator ( o : ĠObject ): ĠIterator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġit ty : ĠIterator ĊĠĠĠĠĠĠĠ Ġif Ġ( o Ġis ĠIterable ) Ġit ty Ġ= Ġ( o Ġas ĠIterable ). iterator () Ġelse Ġif Ġ( o Ġis ĠIterator ) Ġit ty Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo Ġelse Ġif Ġ( o Ġis ĠArray < Object >) Ġit ty Ġ= ĠArray Iterator ( o Ġas ĠArray < Object ?> ) Ġelse Ġif Ġ( o Ġis ĠStream ) Ġit ty Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( o Ġas ĠStream ). iterator () Ġelse Ġif Ġ( o Ġis ĠMap ) Ġit ty Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( o Ġas ĠMap ). entrySet (). iterator () Ġelse Ġif Ġ( o Ġis ĠThrowable ) Ġit ty Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġof (( o Ġas ĠThrowable ). getMessage ()) Ġelse Ġit ty Ġ= Ġof < Any >( o ) ĊĠĠĠĠĠĠĠ Ġreturn Ġit ty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas List ( o : ĠObject ): ĠList Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ( as Iterator ( o )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġ[ Stream ] Ġfrom Ġan Ġ[ Iterator ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġstream ( iterator : ĠIterator < T >? ): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream Support . stream ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpl iter ators . spl iterator Unknown Size ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpl iterator . IM MUT ABLE Ġor ĠSpl iterator . SIZ ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġstream ( iterable : ĠIterable < T >): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstream ( iterable . iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġno Remove ( iterator : ĠIterator < T >): ĠIterator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < T >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġremove On Next ( iterator : ĠIterator < T >): ĠIterator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < T >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` object ` Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ` object ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }