/** Ċ Ġ* ĠB read Wallet Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠD rew ĠCar l son Ġ< d rew . car l son @ bread wallet . com > Ġon Ġ 9 / 1 3 / 1 9 . Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġb read wallet ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . bread wallet . ext Ċ Ċ import Ġcom . bread wallet . logger . log Error Ċ import Ġcom . spotify . mob ius . functions . Consumer Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . channel Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** ĠDispatch Ġeach Ġitem Ġemitted Ġby Ġthis Ġflow Ġto Ġ[ consumer ], Ġlaunch ing Ġin Ġ[ scope ]. Ġ*/ Ċ fun Ġ< T > ĠFlow < T >. bind Consumer In ( consumer : ĠConsumer < T >, Ġscope : ĠCor outine Scope ) Ġ= ĊĠĠĠ Ġon Each Ġ{ Ġconsumer . accept ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" At tempted Ġto Ġdispatch Ġitem Ġin Ġdead Ġconsumer .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. launch In ( scope ) Ċ Ċ fun Ġ< T > ĠFlow < T >. throttle First ( window Duration : ĠLong ): ĠFlow < T > Ġ= Ġflow Ġ{ ĊĠĠĠ Ġvar Ġlast E mission Ms Ġ= Ġ 0 L ĊĠĠĠ Ġcollect Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ms Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ms Ġ- Ġlast E mission Ms Ġ> Ġwindow Duration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast E mission Ms Ġ= Ġcurrent Ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠFlow < T >. throttle Latest ( window Duration : ĠLong ): ĠFlow < T > Ġ= Ġchannel Flow Ġ{ ĊĠĠĠ Ġval ĠisActive Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġval Ġlatest Ġ= ĠAtomic Reference < T >() ĊĠĠĠ Ġval Ġemission s Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġcollect Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ(! isActive . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisActive . set ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( window Duration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( em ission s . get () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( latest . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠisActive . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemission s . set ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlatest . set ( value ) ĊĠĠĠĠĠĠĠ Ġemission s . increment AndGet () ĊĠĠĠ Ġ} Ċ } Ċ