/* ĊĠ ĠCopyright Ġ( c ) Ġ 2 0 2 0 , ĠSur f Studio ĠLLC . ĊĊĠ ĠLicensed Ġ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 Ġru . surf studio . android . core . m vi . impl s . ui . middleware . dsl . transformers . rx Ċ Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Source Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġru . surf studio . android . core . m vi . event . Event Ċ import Ġru . surf studio . android . core . m vi . event . composition . Composition Event Ċ import Ġru . surf studio . android . core . m vi . ui . middleware . Rx Middleware Ċ import Ġjava . lang . IllegalStateException Ċ Ċ /** Ċ Ġ* Ġ[ Composition Event ]' s Ġdecomposition Ġto Ġanother Ġmiddleware . Ċ Ġ* Ċ Ġ* ĠIt Ġworks Ġas Ġfollows : Ċ Ġ* ĠĠ 1 ) ĠExtract s Ġinput Ġevents Ġfrom Ġ[ Composition Event ]. Ċ Ġ* ĠĠ 2 ) ĠP asses Ġevents Ġto Ġanother Ġ[ Rx Middleware ]< [ T ]> Ġresponsible Ġfor Ġmapping Ġfrom Ġinput Ġto Ġoutput . Ċ Ġ* ĠĠ 3 ) ĠPack s Ġoutput Ġevents Ġin Ġthe Ġ[ Composition Event ] Ġand Ġpass Ġit Ġto Ġthe Ġparent Ġmiddleware . Ċ Ġ* Ċ Ġ* Ġ ĠIf Ġthere 's Ġno Ġinput Ġevents , Ġit Ġcan Ġstill Ġproduce Ġoutput Ġevents Ġif Ġnecessary . Ċ Ġ* Ċ Ġ* Ġ ĠOutput Ġevents Ġare Ġcreated Ġby Ġcalling Ġno - args Ġconstructor , Ċ Ġ* Ġ Ġso Ġcomposition Ġevent Ġ[ C ] Ġmust Ġhave Ġone . Ċ Ġ*/ Ċ class ĠComp osition Transformer < T Ġ: ĠEvent , ĠC Ġ: ĠComp osition Event < T >>( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomposition Event Class : ĠClass < C >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmiddleware : ĠRx Middleware < T > Ċ ) Ġ: ĠObservable Transformer < C , ĠC > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( upstream : ĠObservable < C >): ĠObservable Source < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġin Events Ġ= Ġupstream . flatMap Ġ{ Ġcomposition Ġ-> ĠObservable . from Iterable ( composition . events ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġout Events Ġ= Ġmiddleware . transform ( in Events ) ĊĠĠĠĠĠĠĠ Ġreturn Ġout Events . map (:: create Composition Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Composition Event ( nested Event : ĠT ): ĠC Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Composition Event Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Event Class . newInstance () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInstanti ation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠComp osition Event No Constructor Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Composition Event . apply Ġ{ Ġevents Ġ= ĠlistOf ( nested Event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġ[ Composition Transformer ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġuse Ġstatic Ġmethod Ġinstead Ġof Ġconstructor ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġenable Ġtype Ġer asure Ġavoid ing Ġmechanism Ġby ĠKotlin . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< T Ġ: ĠEvent , Ġre ified ĠC Ġ: ĠComp osition Event < T >> Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddleware : ĠRx Middleware < T > ĊĠĠĠĠĠĠĠ Ġ): ĠComp osition Transformer < T , ĠC > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformation Class Ġ= ĠC :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp osition Transformer ( transformation Class , Ġmiddleware ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠComp osition Event No Constructor Exception Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalStateException (" All Ġcomposition Ġevents Ġmust Ġhave Ġno Ġargs Ġconstructor !") Ċ }