package Ġnet . oned aybe ard . trans ducers Ċ Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . reflect . K Class Ċ Ċ type alias ĠX f < A , ĠB > Ġ= ĠTrans ducer < A , ĠB > Ċ type alias ĠR f < R , ĠA > Ġ= ĠRed uc ing Function < R , ĠA > Ċ type alias ĠR f On < R , ĠA , ĠB > Ġ= ĠRed uc ing Function On < R , ĠA , ĠB > Ċ Ċ /** Ċ Ġ* ĠConditional Ġtrans ducer , Ġprimarily Ġuseful Ġfor Ġbranch ing Ġtrans ducers . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ w ires ] Ċ Ġ* Ġ@ see Ġ[ mux ] Ċ Ġ* Ġ@ see Ġ[ result Gate ] Ċ Ġ*/ Ċ data Ġclass ĠSignal < out ĠA , ĠB >( val Ġselector : Ġ( B ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxf : ĠTrans ducer < A , ĠB >) Ċ Ċ private Ġdata Ġclass ĠSignal Rf < in ĠA , Ġin ĠB , ĠR >( val Ġtest : Ġ( B ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrf : ĠRed uc ing Function < R , ĠA >) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Signal ]. Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ mux ] Ċ Ġ*/ Ċ infix Ġfun Ġ< A , ĠB > Ġ(( B ) Ġ-> ĠBoolean ). w ires ( xf : ĠTrans ducer < A , ĠB >) Ġ: ĠSignal < A , ĠB > Ġ{ ĊĠĠĠ Ġreturn ĠSignal ( this , Ġxf ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġbranch ing Ġtrans ducer , Ġrouting Ġeach Ġinput Ġthrough Ċ Ġ* Ġeither Ġ[ xf True ] Ġor Ġ[ xf False ], Ġdepending Ġon Ġthe Ġvalue Ġreturned Ċ Ġ* Ġby Ġ[ test ]. Ċ Ġ* Ċ Ġ* Ġ@ sample Ġsamples . Samples . branch _ a Ċ Ġ* Ġ@ see Ġ[ mux ] Ċ Ġ*/ Ċ fun Ġ< A , ĠB > Ġbranch ( test : Ġ( B ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxf True : ĠTrans ducer < A , ĠB >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxf False : ĠTrans ducer < A , ĠB >): ĠTrans ducer < A , ĠB > Ġ{ ĊĊĠĠĠ Ġreturn Ġmux ( test ĠĠĠĠĠĠĠĠĠĠĠĠ Ġwire s Ġxf True , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_: ĠB Ġ-> Ġtrue Ġ} Ġwire s Ġxf False ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġconsuming Ġall Ġinput , Ġand Ġthen Ġreleases Ġthe Ċ Ġ* Ġinput Ġas Ġan Ġ[ Iterable ] Ġcollection . Ċ Ġ* Ċ Ġ* ĠThe Ġtrans ducer Ġcollect s Ġinto Ġa Ġlist Ġby Ġdefault , Ġcan Ġbe Ġchanged Ġby Ċ Ġ* Ġsupply ing Ġanother Ġ[ collector ]. Ġ[ collector ] Ġis Ġreset Ġafter Ġproducing Ġthe Ċ Ġ* Ġfinal Ġresult . Ċ Ġ* Ċ Ġ* Ġ[ sort ] Ġmay Ġchange Ġthe Ġtype Ġof Ġunderlying Ġcollection . ĠThis Ġimplies Ġallocation . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġsamples . Samples . collect _ a Ċ Ġ* Ġ@ sample Ġsamples . Samples . collect _ b Ċ Ġ*/ Ċ fun Ġ< A > Ġcollect ( ĊĠĠĠ Ġcollector : Ġ() Ġ-> ĠMutable Collection < A > Ġ= Ġ{ Ġmutable ListOf < A >() Ġ}, ĊĠĠĠ Ġsort : Ġ( A , ĠA ) Ġ-> ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠX f < Iterable < A >, ĠA > Ġ= Ġcollect ( collector , ĠComparator ( sort )) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġconsuming Ġall Ġinput , Ġbefore Ġreleasing Ġthe Ċ Ġ* Ġaccumulated Ġinput Ġas Ġan Ġ[ Iterable ] Ġcollection . Ċ Ġ* Ċ Ġ* ĠThe Ġtrans ducer Ġcollect s Ġinto Ġa Ġlist Ġby Ġdefault ; Ġthis Ġcan Ġbe Ġchanged Ġby Ċ Ġ* Ġsupply ing Ġanother Ġ[ collector ]. Ġ[ collector ] Ġis Ġreset Ġafter Ġproducing Ġthe Ċ Ġ* Ġfinal Ġresult . Ċ Ġ* Ċ Ġ* Ġ[ sort ] Ġmay Ġchange Ġthe Ġtype Ġof Ġunderlying Ġcollection . ĠThis Ġimplies Ġallocation . Ċ Ġ*/ Ċ fun Ġ< A > Ġcollect ( ĊĠĠĠ Ġcollector : Ġ() Ġ-> ĠMutable Collection < A > Ġ= Ġ{ Ġmutable ListOf < A >() Ġ}, ĊĠĠĠ Ġsort : ĠComparator < A >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ= Ġobject Ġ: ĠTrans ducer < Iterable < A >, ĠA > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠIterable < A >>) Ġ= Ġobject Ġ: ĠR f < R , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaccumulator : ĠMutable Collection < A > Ġ= Ġcollector () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply (): ĠR Ġ= Ġrf . apply () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accumulator . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġif Ġ( sort Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator . sorted With ( sort ) Ġelse Ġaccumulator ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġrf . apply ( result , Ġinput , ĠAtomic Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrf . apply ( ret ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġcollector () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator . add ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġcounting Ġthe Ġnumber Ġof Ġinput . Ċ Ġ*/ Ċ fun Ġ< A > Ġcount (): ĠTrans ducer < Int , ĠA > Ġ= Ġsum Ġ{ Ġ_ Ġ-> Ġ 1 Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġdebug - ass isting Ġtrans ducer . ĠThis Ġtrans ducer Ċ Ġ* Ġprints Ġeach Ġinput , Ġand Ġthe Ġinitial Ġplus Ġfinal Ġresults . Ċ Ġ*/ Ċ fun Ġ< A > Ġdebug ( tag : ĠString , Ġindent : ĠInt Ġ= Ġ 0 ) Ġ= Ġobject Ġ: ĠTrans ducer < A , ĠA > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠRed uc ing Function < R , ĠA >): ĠRed uc ing Function < R , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġ 1 5 Ġ+ Ġindent ĊĠĠĠĠĠĠĠ Ġval Ġtag Column Ġ= Ġtag . pad End ( length ). replace (' Ġ', Ġ'.') ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRed uc ing Function < R , ĠA > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply (): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrf . apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("# Ġ Ġ$ tag Column Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġrf . apply ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" !! Ġ$ tag Column Ġ$ ret ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("- Ġ$ tag Column Ġ$ input ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrf . apply ( result , Ġinput , Ġreduced ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġwhich Ġonly Ġtakes Ġthe Ġfirst Ġ[ n ] Ġelements . ĠAct s Ċ Ġ* Ġsimilar Ġto Ġ` cat () Ġ+ Ġtake ( n )`, Ġbut Ġdoes Ġnot Ġend Ġthe Ġreduction Ġprocess Ċ Ġ* Ġafter Ġeach Ġbatch Ġof Ġinput . Ċ Ġ* Ċ Ġ* Ġ@ see Ġtail Ċ Ġ* Ġ@ see Ġcat Ċ Ġ*/ Ċ fun Ġ< A > Ġhead ( n : ĠInt ): ĠX f < A , ĠIterable < A >> Ġ= Ġobject Ġ: ĠX f < A , ĠIterable < A >> Ġ Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠA >) Ġ Ġ= Ġobject Ġ: ĠR f On < R , ĠA , ĠIterable < A >>( rf ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠIterable < A >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrans duce ( xf Ġ= Ġtake ( n ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrf Ġ= Ġ{ Ġres : ĠR , Ġa : ĠA Ġ-> Ġrf . apply ( res , Ġa , Ġreduced ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġinput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< A > Ġhead cat ( n : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Op : Ġ( Iterable < A >) Ġ-> ĠIterable < A >) ĊĠĠĠĠĠĠĠ Ġ= Ġobject Ġ: ĠX f < A , ĠIterable < A >> Ġ Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠA >): ĠR f < R , ĠIterable < A >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġobject Ġ: ĠR f On < R , ĠA , ĠIterable < A >>( rf ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠIterable < A >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrans duce ( xf Ġ= Ġtake ( n ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrf Ġ= Ġ{ Ġres : ĠR , Ġa : ĠA Ġ-> Ġrf . apply ( res , Ġa , ĠAtomic Boolean ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġinput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠTakes Ġa Ġlist Ġof Ġtrans ducers Ġproducing Ġ[ A ], Ġand Ġturns Ġit Ġinto Ġa Ċ Ġ* Ġsingle Ġcomposed Ġtrans ducer Ġproducing Ġa Ġlist Ġof Ġ[ A ]. ĠSup p lied Ċ Ġ* Ġtrans ducers Ġcan Ġproduce Ġzero Ġor Ġmore Ġoutput Ġper Ġinput Ġvalue , Ċ Ġ* Ġand Ġrely Ġon Ġcompletion Ġto Ġflush Ġany Ġinternal Ġstate . Ċ Ġ* Ċ Ġ* ĠIf Ġtrans ducers Ġrequire Ġconditional Ġevaluation , Ġworking Ġwith Ġ[ mux ] Ċ Ġ* Ġin Ġ` prom is cu ous ` Ġmode Ġmay Ġbe Ġan Ġalternative Ġapproach , Ġas Ċ Ġ* Ġit Ġsupports Ġinput Ġrouting Ġusing Ġpredicates . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġeach Ġof Ġthe Ġsupplied Ġtrans ducers Ġreset Ġthe Ġtrans duction Ġ( ?) Ċ Ġ* Ġstate Ġbetween Ġinputs , Ġthus Ġstate ful Ġtrans ducers , Ġsuch Ġas Ġ[ distinct ], Ġare Ċ Ġ* Ġscoped Ġto Ġeach Ġinput Ġvalue Ċ Ġ* Ċ Ġ* Ġ@ see Ġmux Ċ Ġ*/ Ċ fun Ġ< A , ĠB > Ġjoin ( xf s : ĠList < Xf < A , ĠB >> ): ĠX f < List < A >, ĠB > Ġ= Ġobject Ġ: ĠX f < List < A >, ĠB > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠList < A >>) Ġ= Ġobject Ġ: ĠR f On < R , ĠList < A >, ĠB >( rf ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub Xf Ġ= Ġx fs . map Ġ{ ĠSignal ({ Ġtrue Ġ}, Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġmux (* it , Ġprom is cu ous Ġ= Ġtrue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrf . apply ( result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( sub Xf , Ġinput . with Iterable ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< A , ĠB > Ġjoin ( var arg Ġx fs : ĠX f < A , ĠB >): ĠX f < List < A >, ĠB > Ġ= Ġjoin ( xf s . toList ()) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġcreating Ġ[ Pair ] s , Ġwith Ġvalues Ġprovided Ċ Ġ* Ġvia Ġtrans ducers Ġ[ l ] Ġand Ġ[ r ]. ĠEach Ġvalue Ġtrans ducer Ġruns Ġa Ġfull Ċ Ġ* Ġtrans duc ible Ġprocess / lifecycle Ġper Ġinput , Ġallowing Ġfor Ċ Ġ* Ġmore Ġs oph istic ated Ġtrans ducers Ġat Ġthe Ġcost Ġof Ġperformance . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ sub duce ] Ċ Ġ* Ġ@ sample Ġnet . oned aybe ard . trans ducers . Experimental Trans ducers Test . test _ sub duce Ċ Ġ*/ Ċ inline Ġfun Ġ< B , Ġre ified ĠK , Ġre ified ĠV > Ġmap Pair ( l : ĠX f < K , ĠB >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr : ĠX f < V , ĠB >): ĠX f < Pair < K , ĠV >, ĠB > ĊĠĠĠĠĠĠĠ Ġwhere ĠK Ġ: ĠAny , ĠV Ġ: ĠAny Ġ{ ĊĊĠĠĠ Ġreturn Ġobject Ġ: ĠTrans ducer < Pair < K , ĠV >, ĠB > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠPair < K , ĠV >> ): ĠR f < R , ĠB > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRed uc ing Function < R , ĠB > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Rf : ĠR f < K , ĠB > Ġ= Ġsub ducing ( l ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Rf : ĠR f < V , ĠB > Ġ= Ġsub ducing ( r ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ= Ġrf . apply ( result ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrf . apply ( result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( sub duce ( l Rf , Ġinput ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub duce ( r Rf , Ġinput )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġmultip lex ing Ġtrans ducer , Ġrouting Ġinput Ġthrough Ġdifferent Ċ Ġ* Ġtrans ducers . ĠTrans ducer Ġroute Ġis Ġselected Ġbased Ġon Ġthe Ġoutcome Ġof Ċ Ġ* Ġ[ Signal . selector ], Ġevaluated Ġin Ġsequential Ġorder . ĠUn matched Ġinput Ċ Ġ* Ġare Ġdiscarded . Ċ Ġ* Ċ Ġ* ĠPer Ġdefault , Ġeach Ġinput Ġis Ġassociated Ġwith Ġat Ġmost Ġ_ one _ Ġtrans ducer Ċ Ġ* Ġroute . ĠIf Ġ[ prom is cu ous ] Ġis Ġ` true `, Ġinput Ġpasses Ġthrough Ġevery Ċ Ġ* Ġmatching Ġtrans ducer . Ċ Ġ* Ċ Ġ* ĠWhen Ġall Ġinput Ġhas Ġbeen Ġex hausted , Ġeach Ġroute Ġprocesses Ġthe Ġfinal Ċ Ġ* Ġresult . ĠSub sequent Ġtrans ducers Ġare Ġ[ gu arded ][ result Gate ] Ġagainst Ċ Ġ* Ġmultiple Ġinv ocations Ġof Ġ` Reduc ing Function :: apply ( result )`. Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠ Ġ< A , B > ĠĠĠĠĠĠĠĠ Ġ< B , C > ĠĠĠĠĠĠĠĠĠĠ Ġ(< B , C >) ĠĠĠĠĠĠĠĠĠ Ġ< C , D > Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ -------+ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ --> + ĠX f Ġ 3 a Ġ+ ---+ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ+ -------+ ĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠ Ġ+ -------+ ĠĠĠĠ Ġ+ -------+ ĠĠĠ Ġ| ĠĠ Ġ+ -------+ ĠĠ Ġ| ĠĠ Ġ+ -------+ Ċ Ġ* ĠĠ Ġ| ĠX f Ġ 1 Ġ Ġ+ ---- > + Ġ Ġmux Ġ Ġ+ ------ -> + ĠX f Ġ 3 b Ġ+ ---- --> + ĠX f Ġ 4 Ġ Ġ| Ċ Ġ* ĠĠ Ġ+ -------+ ĠĠĠĠ Ġ+ -------+ ĠĠĠ Ġ| ĠĠ Ġ+ -------+ ĠĠ Ġ| ĠĠ Ġ+ -------+ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ+ -------+ ĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ --> + ĠX f Ġ 3 c Ġ+ ---+ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ -------+ Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠDep ict ed Ġtrans ducers Ġ` 3 a `, Ġ` 3 b ` Ġand Ġ` 3 c ` Ġmay Ġbe Ġcomposed Ġof Ġone Ġor Ġmore Ċ Ġ* Ġtrans ducers , Ġand Ġcan Ġproduce Ġzero Ġor Ġmany Ġoutputs Ġper Ġinput Ġvalue . Ċ Ġ* ĠTrans ducer Ġsignature Ġis Ġthe Ġsame Ġfor Ġeach Ġroute , Ġas Ġgiven Ġby Ġ[ mux ]. Ċ Ġ* Ċ Ġ* Ġ@ sample Ġsamples . Samples . mux _ a Ċ Ġ* Ġ@ sample Ġsamples . Samples . mux _ b Ċ Ġ* Ġ@ see Ġjoin Ċ Ġ*/ Ċ fun Ġ< A , ĠB > Ġmux ( xf s : ĠList < Signal < A , ĠB >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprom is cu ous : ĠBoolean Ġ= Ġfalse ) Ġ= Ġmux ing ( xf s , Ġprom is cu ous ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Gate ( xf s . size ) Ċ fun Ġ< A , ĠB > Ġmux ( var arg Ġx fs : ĠSignal < A , ĠB >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprom is cu ous : ĠBoolean Ġ= Ġfalse ) Ġ= Ġmux ing ( xf s . as Iterable (), Ġprom is cu ous ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Gate ( xf s . size ) ĊĊĊ Ċ private Ġfun Ġ< A , ĠB > Ġmux ing ( xf s : ĠIterable < Signal < A , ĠB >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprom is cu ous : ĠBoolean Ġ= Ġfalse ) Ġ= Ġobject Ġ: ĠX f < A , ĠB > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠA >) Ġ= Ġobject Ġ: ĠR f < R , ĠB > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġr fs Ġ= Ġx fs . map Ġ{ ĠSignal Rf ( it . selector , Ġit . xf . apply ( rf )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( mux Ġin Ġr fs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ= Ġmux . rf . apply ( r ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Matched R fs Ġ= Ġif Ġ( prom is cu ous ) Ġr fs . size Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrans duce ( xf Ġ= Ġfilter Ġ{ Ġs : ĠSignal Rf < B , ĠB , ĠR > Ġ-> Ġs . test ( input ) Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake ( max Matched R fs ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrf Ġ= Ġ{ Ġ_: ĠR , Ġmux Ġ-> Ġmux . rf . apply ( result , Ġinput , Ġreduced ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġr fs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġconcaten ating Ġpairs Ġof Ġ` Pair < A , ĠIterable < B >> ` Ġinto Ċ Ġ* Ġ` Pair < A , ĠB >`. Ċ Ġ*/ Ċ fun Ġ< F , ĠA > Ġpair Cat () Ġ= Ġobject Ġ: ĠX f < Pair < F , ĠA >, ĠPair < F , ĠIterable < A >>> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠRed uc ing Function < R , ĠPair < F , ĠA >>) ĊĠĠĠĠĠĠĠ Ġ= Ġobject Ġ: ĠR f On < R , ĠPair < F , ĠA >, ĠPair < F , ĠIterable < A >> >( rf ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠPair < F , ĠIterable < A >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ) Ġ= Ġreduce Pair ( rf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġensuring Ġ_ completion _ Ġis Ġcalculated Ġonce , Ġused Ċ Ġ* Ġby Ġ[ branch ] ing /[ mux ] ing Ġtrans ducers . Ċ Ġ*/ Ċ fun Ġ< A > Ġresult Gate ( count : ĠInt ) Ġ= Ġobject Ġ: ĠTrans ducer < A , ĠA > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠRed uc ing Function < R , ĠA >) Ġ= Ġobject Ġ: ĠR f On < R , ĠA , ĠA >( rf ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġcount ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining -- ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( remaining ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġrf . apply ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! in Ġ 0 .. count Ġ-> Ġthrow ĠUnsupportedOperationException (" negative : Ġ$ remaining ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠ Ġ-> Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrf . apply ( result , Ġinput , Ġreduced ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġtrans ducer Ġcollecting Ġall Ġinput , Ġbefore Ġreleasing Ċ Ġ* Ġeach Ġelement Ġin Ġsorted Ġorder . Ċ Ġ*/ Ċ fun Ġ< A > Ġsort ( sort : Ġ( o 1 : ĠA , Ġo 2 : ĠA ) Ġ-> ĠInt ) Ġ= Ġcollect ( sort Ġ= Ġsort ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcat < A >() Ċ Ċ /** Ċ Ġ* ĠCalculates Ġsum Ġof Ġall Ġinput . Ċ Ġ*/ Ċ fun Ġ< A Ġ: ĠNumber > Ġsum () Ġ= Ġsum Ġ{ Ġi : ĠA Ġ-> Ġi Ġ} Ċ Ċ /** Ċ Ġ* ĠCalculates Ġsum Ġbased Ġon Ġvalues Ġproduced Ġby Ġ[ f ]. Ċ Ġ* Ċ Ġ* Ġ@ sample Ġsamples . sum _ a Ċ Ġ* Ċ Ġ* ĠTesting Ġfor Ġfun ... Ċ Ġ* Ċ Ġ* Ġ@ sample Ġsamples . sum _ b Ċ Ġ*/ Ċ fun Ġ< A Ġ: ĠNumber , ĠB > Ġsum ( f : Ġ( b : ĠB ) Ġ-> ĠA ) Ġ= Ġobject Ġ: ĠTrans ducer < A , ĠB > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠA >) Ġ= Ġobject Ġ: ĠR f < R , ĠB > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaccumulator : ĠA ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply (): ĠR Ġ= Ġrf . apply () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accumulator Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġrf . apply ( result , Ġaccumulator !! , ĠAtomic Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrf . apply ( ret ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accumulator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġaccumulator !! Ġ+ Ġf ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġf ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ", Ġ" IMP LICIT _ CAST _ TO _ ANY ") ĊĠĠĠĠĠĠĠ Ġprivate Ġoperator Ġfun ĠA . plus ( other : ĠA ): ĠA Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt ĠĠĠ Ġ-> Ġthis Ġ+ Ġother Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ Ġ-> Ġthis Ġ+ Ġother Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġthis Ġ+ Ġother Ġas ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong ĠĠ Ġ-> Ġthis Ġ+ Ġother Ġas ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByte ĠĠ Ġ-> Ġthis Ġ+ Ġother Ġas ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Ġ Ġ-> Ġthis Ġ+ Ġother Ġas ĠShort ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠA ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠApplies Ġgiven Ġreducing Ġfunction Ġto Ġcurrent Ġresult Ġand Ġeach ĠT Ġin Ġinput , Ġusing Ċ Ġ* Ġthe Ġresult Ġreturned Ġfrom Ġeach Ġreduction Ġstep Ġas Ġinput Ġto Ġthe Ġnext Ġstep . ĠReturns Ċ Ġ* Ġfinal Ġresult . Ċ Ġ* Ġ@ param Ġf Ġa Ġreducing Ġfunction Ċ Ġ* Ġ@ param Ġresult Ġan Ġinitial Ġresult Ġvalue Ċ Ġ* Ġ@ param Ġinput Ġthe Ġinput Ġto Ġprocess Ċ Ġ* Ġ@ param Ġreduced Ġa Ġboolean Ġflag Ġthat Ġcan Ġbe Ġset Ġto Ġindicate Ġthat Ġthe Ġreducing Ġprocess Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Ġstop , Ġeven Ġthough Ġthere Ġis Ġstill Ġinput Ġto Ġprocess Ċ Ġ* Ġ@ param Ġ< R > Ġthe Ġtype Ġof Ġthe Ġresult Ċ Ġ* Ġ@ param Ġ< T > Ġthe Ġtype Ġof Ġeach Ġitem Ġin Ġinput Ċ Ġ* Ġ@ return Ġthe Ġfinal Ġreduced Ġresult Ċ Ġ*/ Ċ fun Ġ< R , ĠF , ĠT > Ġreduce Pair ( f : ĠRed uc ing Function < R , ĠPair < F , ĠT >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠPair < F , ĠIterable < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean Ġ= ĠAtomic Boolean ()): ĠR Ġ{ ĊĊĠĠĠ Ġvar Ġret Ġ= Ġresult ĊĠĠĠ Ġfor Ġ( t Ġin Ġinput . second ) Ġ{ ĊĠĠĠĠĠĠĠ Ġret Ġ= Ġf . apply ( ret , ĠPair ( input . first , Ġt ), Ġreduced ) ĊĠĠĠĠĠĠĠ Ġif Ġ( reduced . get ()) Ġbreak ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġret Ċ } Ċ Ċ /** Ċ Ġ* ĠPerforms Ġa Ġfull Ġtrans duction Ġon Ġa Ġsingle Ġinput . ĠTypically , Ċ Ġ* Ġused Ġin Ġconjunction Ġwith Ġ[ sub duce ]. ĠUseful Ġfor Ġconstruction Ċ Ġ* Ġof Ġpairs , Ġtuples Ġand Ġsimilar Ġdata Ġstructures Ġ- Ġusing Ċ Ġ* Ġseparate Ġtrans ducers Ġper Ġfield . Ċ Ġ* Ċ Ġ* Ġ@ see Ġsub ducing Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠA Ġ: ĠAny , ĠB > Ġsub duce ( rf : ĠRed uc ing Function < A , ĠB >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean Ġ= ĠAtomic Boolean ()): ĠA Ġ{ ĊĊĠĠĠ Ġval Ġr Ġ= Ġrf . apply ( rf . apply (), Ġinput , Ġreduced ) ĊĠĠĠ Ġreturn Ġrf . apply ( r ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġspecialized Ġ[ Reduc ing Function ] Ġfor Ġ[ xf ], Ġtre ating Ġeach Ċ Ġ* Ġinput Ġas Ġa Ġfull Ġtrans duc ible Ġprocess Ġ- Ġinvoking Ġeach Ġof Ġthe Ċ Ġ* Ġthree Ġ[ Reduc ing Function . apply ] Ġfunctions Ġonce . Ċ Ġ* Ċ Ġ* ĠAn Ġinitial Ġresult Ġis Ġcomputed Ġbased Ġon Ġthe Ġtype Ġof Ġ[ A ]. Ċ Ġ* Ċ Ġ* Ġ@ see Ġsub duce Ċ Ġ*/ Ċ @ Suppress (" IMP LICIT _ CAST _ TO _ ANY ") Ċ inline Ġfun Ġ< re ified ĠA Ġ: ĠAny , ĠB > Ġsub ducing ( xf : ĠX f < A , ĠB >): ĠR f < A , ĠB > Ġ{ ĊĠĠĠ Ġreturn Ġsub ducing ( xf ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( A :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class Ġ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByte :: class ĠĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChar :: class ĠĠĠĠ Ġ-> Ġ' Ġ' ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShort :: class ĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class ĠĠĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class ĠĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class ĠĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble :: class ĠĠ Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK Class :: class ĠĠ Ġ-> ĠK Class :: class ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField :: class ĠĠĠ Ġ-> ĠDummy (). field ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIterable :: class Ġ-> Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠA :: class . java . newInstance () ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠA ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġspecialized Ġ[ Reduc ing Function ], Ġtre ating Ġeach Ċ Ġ* Ġinput Ġas Ġa Ġfull Ġtrans duc ible Ġprocess Ġ- Ġinvoking Ġeach Ġof Ġthe Ċ Ġ* Ġthree Ġ[ Reduc ing Function . apply ] Ġfunctions Ġonce . Ċ Ġ* Ċ Ġ* ĠInitial Ġresult Ġsupplied Ġby Ġ[ init ], Ġinvoked Ġonce Ġduring Ċ Ġ* Ġinitialization . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠA Ġ: ĠAny , ĠB > Ġsub ducing ( xf : ĠX f < A , ĠB >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġinit : Ġ() Ġ-> ĠA ): ĠR f < A , ĠB > Ġ{ ĊĊĠĠĠ Ġreturn Ġxf . apply ( object Ġ: ĠRed uc ing Function < A , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhas Deliver ed Result Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġinitial : ĠA Ġ= Ġinit () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply (): ĠA Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Deliver ed Result Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinitial ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠA ): ĠA Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Deliver ed Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" final Ġresult Ġalready Ġcomputed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Deliver ed Result Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠA Ġ= Ġinput ĊĠĠĠ Ġ}) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġtrans ducer Ġwhich Ġonly Ġprocesses Ġthe Ġlast Ġ[ n ] Ġelements Ċ Ġ* Ġper Ġinput Ġiterable . Ċ Ġ* Ċ Ġ* Ġ@ see Ġhead Ċ Ġ* Ġ@ see Ġcat Ċ Ġ*/ Ċ fun Ġ< A > Ġtail ( n : ĠInt ): ĠX f < A , ĠIterable < A >> Ġ= Ġobject Ġ: ĠX f < A , ĠIterable < A >> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġapply ( rf : ĠR f < R , ĠA >) Ġ= Ġobject Ġ: ĠR f On < R , ĠA , ĠIterable < A >>( rf ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġt ailed Ġ= ĠLinkedList < A >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( result : ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠIterable < A >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced : ĠAtomic Boolean ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreduce Action : Ġ( A ) Ġ-> ĠUnit Ġ= Ġ{ Ġres Ġ= Ġrf . apply ( res , Ġit , Ġreduced ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < A > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . take Last ( n ). forEach ( reduce Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . forEach Ġ{ Ġt ailed . push ( it , ĠmaxSize Ġ= Ġn ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ailed . forEach ( reduce Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ailed . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġ< A > ĠMutable List < A >. push ( element : ĠA , ĠmaxSize : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġdiff Ġ= Ġ( size Ġ+ Ġ 1 ) Ġ- ĠmaxSize ĊĠĠĠ Ġif Ġ( diff Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ( 1 .. diff ). forEach Ġ{ Ġremove At ( 0 ) Ġ} ĊĊĠĠĠ Ġadd ( element ) Ċ } Ċ Ċ class ĠDummy Ġ{ ĊĠĠĠ Ġval Ġfield : ĠField Ġ= ĠDummy :: class . java . getDeclared Field (" field ") Ċ } Ċ