package Ġcom . red mad robot . flip per Ċ Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġcom . red mad robot . flip per . config . Flip per Config Ċ import Ġcom . red mad robot . flip per . config . Flip per Value Ċ import Ġcom . red mad robot . flip per . config . Flip per Value . Boolean Value Ċ import Ġcom . red mad robot . flip per . ext . Flip per Predicate Ċ Ċ object ĠToggle Router Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠBAD _ FLI P PER POINT _ MESSAGE Ġ= Ġ" It 's Ġnot Ġa Ġflip per Ġpoint : Ġ% s " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfiguration : ĠFlip per Config ĊĊĠĠĠ Ġfun Ġinit ( config : ĠFlip per Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfiguration Ġ= Ġconfig ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġflip ( feature : ĠFeature , Ġflip per Point : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( flip per Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Ġ-> Ġflip View ( feature , Ġflip per Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMenuItem Ġ-> Ġflip MenuItem ( feature , Ġflip per Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction 0 < *> Ġ-> Ġflip Function ( feature , Ġflip per Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( BAD _ FLI P PER POINT _ MESSAGE . format ( flip per Point )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġflip ( feature : ĠFeature , Ġflip per Point : ĠAny , Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( flip per Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Ġ-> Ġflip View ( feature , Ġflip per Point , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMenuItem Ġ-> Ġflip MenuItem ( feature , Ġflip per Point , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction 0 < *> Ġ-> Ġflip Function ( feature , Ġflip per Point , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( BAD _ FLI P PER POINT _ MESSAGE . format ( flip per Point )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġflip Ab ( feature : ĠFeature , Ġflip per Point : ĠAny , Ġalternative : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( flip per Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Ġ-> Ġflip View Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMenuItem Ġ-> Ġflip MenuItem Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠMenuItem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction 0 < *> Ġ-> Ġflip Function Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠFunction 0 <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( BAD _ FLI P PER POINT _ MESSAGE . format ( flip per Point )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġflip Ab ( feature : ĠFeature , Ġflip per Point : ĠAny , Ġalternative : ĠAny , Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( flip per Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Ġ-> Ġflip View Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠView , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMenuItem Ġ-> Ġflip MenuItem Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠMenuItem , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction 0 < *> Ġ-> Ġflip Function Ab ( feature , Ġflip per Point , Ġalternative Ġas ĠFunction 0 <* >, Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( BAD _ FLI P PER POINT _ MESSAGE . format ( flip per Point )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< T > Ġreturn Ab ( feature : ĠFeature , Ġvalue A : ĠT , Ġvalue B : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( extract Boolean Value ( feature )) Ġvalue A Ġelse Ġvalue B ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< T > Ġreturn Ab ( feature : ĠFeature , Ġvalue A : Ġ() Ġ-> ĠT , Ġvalue B : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( extract Boolean Value ( feature )) Ġvalue A () Ġelse Ġvalue B () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< T > Ġreturn Ab ( feature : ĠFeature , Ġvalue A : ĠT , Ġvalue B : ĠT , Ġpredicate : ĠFlip per Predicate ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġvalue A Ġelse Ġvalue B ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< T > Ġreturn Ab ( feature : ĠFeature , Ġvalue A : Ġ() Ġ-> ĠT , Ġvalue B : Ġ() Ġ-> ĠT , Ġpredicate : ĠFlip per Predicate ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġvalue A () Ġelse Ġvalue B () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġselect ( feature : ĠFeature , Ġmapping : ĠMap < Flip per Value , ĠT >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġconfiguration . getValue ( feature ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmapping [ key ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequire NotNull ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Key Ġ`$ key ` Ġis Ġnot Ġfound . ĠSelection Ġmapping Ġmust Ġbe Ġex haustive ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip View ( feature : ĠFeature , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . visibility Ġ= Ġif Ġ( extract Boolean Value ( feature )) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip View ( feature : ĠFeature , Ġview : ĠView , Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . visibility Ġ= Ġif Ġ( predicate ( configuration . getValue ( feature ))) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip View Ab ( feature : ĠFeature , Ġview : ĠView , Ġalternative View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extract Boolean Value ( feature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip View Ab ( feature : ĠFeature , Ġview : ĠView , Ġalternative View : ĠView , Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip MenuItem ( feature : ĠFeature , Ġmenu Item : ĠMenuItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġextract Boolean Value ( feature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip MenuItem ( feature : ĠFeature , Ġmenu Item : ĠMenuItem , Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġpredicate ( configuration . getValue ( feature )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip MenuItem Ab ( feature : ĠFeature , Ġmenu Item : ĠMenuItem , Ġalternative MenuItem : ĠMenuItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extract Boolean Value ( feature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative MenuItem . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative MenuItem . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip MenuItem Ab ( ĊĠĠĠĠĠĠĠ Ġfeature : ĠFeature , ĊĠĠĠĠĠĠĠ Ġmenu Item : ĠMenuItem , ĊĠĠĠĠĠĠĠ Ġalternative MenuItem : ĠMenuItem , ĊĠĠĠĠĠĠĠ Ġpredicate : ĠFlip per Predicate ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative MenuItem . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative MenuItem . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip Function ( feature : ĠFeature , Ġfunction : ĠFunction 0 <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extract Boolean Value ( feature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip Function ( feature : ĠFeature , Ġfunction : ĠFunction 0 <* >, Ġpredicate : ĠFlip per Predicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip Function Ab ( feature : ĠFeature , Ġfunction : ĠFunction 0 <* >, Ġalternative Function : ĠFunction 0 <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extract Boolean Value ( feature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative Function () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip Function Ab ( ĊĠĠĠĠĠĠĠ Ġfeature : ĠFeature , ĊĠĠĠĠĠĠĠ Ġfunction : ĠFunction 0 <* >, ĊĠĠĠĠĠĠĠ Ġalternative Function : ĠFunction 0 <* >, ĊĠĠĠĠĠĠĠ Ġpredicate : ĠFlip per Predicate ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( configuration . getValue ( feature ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternative Function () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Boolean Value ( feature : ĠFeature ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Value Ġ= Ġconfiguration . getValue ( feature ) ĊĊĠĠĠĠĠĠĠ Ġrequire ( feature Value Ġis ĠBoolean Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmust Ġset Ġpredicate Ġexplicitly Ġwhen Ġusing Ġ${ feature Value . java Class . canonical Name } ." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfeature Value . value ĊĠĠĠ Ġ} Ċ } Ċ