/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 . ĠS aff i ĠH art al . Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġsa ff ih . stream tools Ċ Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . Predicate Ċ import Ġjava . util . stream . Stream Ċ import Ġjava . util . stream . Stream Support Ċ Ċ object Ġstream Util Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadd ĠPending Ġaction Ġto Ġthe Ġstream ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĊĠĠĠĠ Ġ* Ġ@ param Ġconsumer ĊĠĠĠĠ Ġ* Ġ@ return ĠStream Ġwith Ġaction Ġwhen Ġconsumed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġon Consume ( target : ĠStream < T >, Ġconsumer : ĠConsumer < Void ?> ): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjoin Streams ( target , Ġcreate Stream Action ( consumer )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġconsumer ĊĠĠĠĠ Ġ* Ġ@ param Ġ< T > ĊĠĠĠĠ Ġ* Ġ@ return ĠEmpty Ġstream Ġwith Ġcall Ġthe Ġconsumer Ġwhen Ġread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġcreate Stream Action ( consumer : ĠConsumer < Void ?> ): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream . of < T >( null ). peek Ġ{ Ġconsumer . accept ( null ) Ġ}. filter Ġ{ Ġfalse Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠJoin Ġtwo Ġstreams . ĊĠĠĠĠ Ġ* Ġ@ param Ġfirst Ġstream ĊĠĠĠĠ Ġ* Ġ@ param Ġsecond Ġsecond ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġjoin Streams ( first : ĠStream < T >, Ġsecond : ĠStream < T >): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream . of ( first , Ġsecond ). flatMap Ġ{ Ġi Ġ-> Ġi Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNull Ġterminated Ġgenerator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġgenerator T ill Null ( generator : Ġ( Int ) Ġ-> ĠT ?): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtake While ( Stream . iterate ( 0 ) Ġ{ Ġi Ġ-> Ġi !! Ġ+ Ġ 1 Ġ}. map ( generator )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNull Ġterminated Ġstream ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġtake While ( stream : ĠStream < T ?> ): ĠStream < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpredicate Ġ= ĠPredicate < T ?> Ġ{ ĠObjects . non Null ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtake While ( stream , Ġpredicate ). map Ġ{ Ġit !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġtake While Ġimplementation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġtake While ( stream : ĠStream < T ? >, Ġpredicate : ĠPredicate < in ĠT ?> ): ĠStream < T ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream Support . stream ( take While ( stream . spl iterator (), Ġpredicate ), Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhttps :// stackoverflow . com / questions / 2 0 7 4 6 4 2 9 / limit - a - stream - by - a - predicate ĊĠĠĠ Ġ// *** Ġ Ġtill Ġwe Ġuse Ġjava Ġ 1 . 9 Ġ*** / ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġtake While ( split r : ĠSpl iterator < T ? >, Ġpredicate : ĠPredicate < in ĠT ?> ): ĠSpl iterator < T ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠSpl iter ators . Abstract Spl iterator < T ? >( split r . estimate Size (), Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstill Go ing Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtry Advance ( consumer : ĠConsumer < in ĠT ?> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( still Go ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhad Next Ġ= Ġsplit r . try Advance Ġ{ Ġelem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate . test ( elem )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( elem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstill Go ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhad Next Ġ&& Ġstill Go ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ fun Ġ< T > ĠStream < T >. autoc lose () Ġ= Ġthis . on Consume ( Consumer Ġ{ Ġclose () Ġ}) Ċ fun Ġ< T > ĠStream < T >. on Consume ( consumer : Ġ() Ġ-> ĠUnit ) Ġ= Ġstream Util . on Consume ( this , ĠConsumer Ġ{ Ġconsumer . invoke () Ġ}) Ċ fun Ġ< T > ĠStream < T >. on Consume ( consumer : ĠConsumer < Void ?> ) Ġ= Ġstream Util . on Consume ( this , Ġconsumer ) Ċ fun Ġ< T > ĠStream < T ?> . take While ( predicate : ĠPredicate < in ĠT ?> ) Ġ= Ġstream Util . take While ( this , Ġpredicate ) Ċ fun Ġ< T > ĠStream < T ?> . till Null () Ġ= Ġthis . till Null Sub (). map Ġ{ Ġit !! Ġ} Ċ fun Ġ< T > ĠStream < T >. join ( other : ĠStream < T >) Ġ= Ġstream Util . join Streams ( this , Ġother ) Ċ Ċ private Ġfun Ġ< T > ĠStream < T ?> . till Null Sub () Ġ= Ġstream Util . take While ( this , ĠPredicate < T ?> Ġ{ Ġit Ġ-> Ġit Ġ!= Ġnull Ġ}) Ċ