/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ- Ġpresent ĠIn structure , ĠInc . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġversion Ġ 3 Ġof Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ* Ċ Ġ*/ Ċ @ file : Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ Ċ package Ġcom . in structure . student . mob ius . common Ċ Ċ import Ġcom . spotify . mob ius . EventSource Ċ import Ġcom . spotify . mob ius . dis pos ables . Disposable Ċ import Ġcom . spotify . mob ius . functions . Consumer Ċ import Ġcom . squareup . sql de light . Query Ċ Ċ /** Ċ Ġ* ĠAn ĠEvent Source Ġwhich Ġa ids Ġin Ġmapping Ġdatabase Ġupdates Ġof Ġone Ġtype Ġto Ġevents Ġa Ġdifferent Ġtype . ĠTo Ġuse Ġthis Ġclass , Ċ Ġ* Ġeither Ġcreate Ġa Ġsubclass Ġand Ġoverride Ġ[ execute And Map ], Ġor Ġuse Ġa Ġhelper Ġlike Ġ[ DB Source . of List ] Ġand Ġpass Ġin Ġa Ġfunction Ċ Ġ* Ġthat Ġperforms Ġevent Ġmapping . Ċ Ġ*/ Ċ abstract Ġclass ĠDB Source < T Ġ: ĠAny , ĠE Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġquery : ĠQuery < T >, ĊĠĠĠ Ġprivate Ġval Ġperform Initial Query : ĠBoolean Ġ= Ġtrue Ċ ) Ġ: ĠEvent Source < E > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( event Consumer : ĠConsumer < E >): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠQuery . Listener Ġ= Ġobject Ġ: ĠQuery . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġquery Results Changed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute And Map ( query )?. let Ġ{ Ġevent Consumer . accept ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġquery . addListener ( listener ) ĊĠĠĠĠĠĠĠ Ġif Ġ( perform Initial Query ) Ġexecute And Map ( query )?. let Ġ{ Ġevent Consumer . accept ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDis posable Ġ{ Ġquery . remove Listener ( listener ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTakes Ġin Ġa Ġquery Ġof Ġtype Ġ[ T ] Ġand Ġreturns Ġevents Ġof Ġthe Ġtarget Ġtype Ġ[ E ]. ĠReturns Ġnull Ġif Ġthere Ġis Ġno Ġvalid Ġmapping ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġinput Ġevent Ġor Ġif Ġan Ġoutput Ġevent Ġshould Ġnot Ġbe Ġproduced . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġexecute And Map ( query : ĠQuery < T >): ĠE ? ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġsingle - value Ġ[ DB Source ] Ġobject Ġfor Ġquery Ġdata Ġtype Ġ[ T ] Ġand Ġtarget Ġevent Ġtype Ġ[ E ]. ĠA Ġ[ mapper ] Ġfunction ĊĠĠĠĠĠĠĠĠ Ġ* Ġmust Ġbe Ġprovided Ġto Ġmap Ġinput Ġevents Ġof Ġtype Ġ[ T ] Ġto Ġevents Ġof Ġtype Ġ[ E ]. ĠThis Ġfunction Ġmay Ġreturn Ġa Ġnull Ġvalue ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġthere Ġis Ġno Ġvalid Ġmapping Ġfor Ġthe Ġinput Ġevent Ġor Ġif Ġan Ġoutput Ġevent Ġshould Ġnot Ġbe Ġproduced . ĠThe Ġinput Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġfunction Ġwill Ġbe Ġnull Ġif Ġthe Ġquery Ġreturns Ġno Ġresults . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠE Ġ: ĠAny > Ġof Single ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery : ĠQuery < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Initial Query : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġmapper : Ġ( T ?) Ġ-> ĠE ? ĊĠĠĠĠĠĠĠ Ġ): ĠDB Source < T , ĠE > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠDB Source < T , ĠE >( query , Ġperform Initial Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute And Map ( query : ĠQuery < T >): ĠE ? Ġ= Ġmapper ( query . execute As One OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġlist - value Ġ[ DB Source ] Ġobject Ġwith Ġquery Ġdata Ġtype Ġ[ T ] Ġand Ġtarget Ġevent Ġtype Ġ[ E ]. ĠA Ġ[ mapper ] Ġfunction ĊĠĠĠĠĠĠĠĠ Ġ* Ġmust Ġbe Ġprovided Ġto Ġmap Ġinput Ġevents Ġof Ġtype Ġ[ List < T >] Ġto Ġevents Ġof Ġtype Ġ[ E ]. ĠThis Ġfunction Ġmay Ġreturn Ġa Ġnull ĊĠĠĠĠĠĠĠĠ Ġ* Ġvalue Ġif Ġthere Ġis Ġno Ġvalid Ġmapping Ġfor Ġthe Ġinput Ġevent Ġor Ġif Ġan Ġoutput Ġevent Ġshould Ġnot Ġbe Ġproduced . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠE Ġ: ĠAny > Ġof List ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery : ĠQuery < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Initial Query : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġmapper : Ġ( List < T >) Ġ-> ĠE ? ĊĠĠĠĠĠĠĠ Ġ): ĠDB Source < T , ĠE > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠDB Source < T , ĠE >( query , Ġperform Initial Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute And Map ( query : ĠQuery < T >): ĠE ? Ġ= Ġmapper ( query . execute As List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ