package Ġhu . n emi . abc store . core Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin . in Order Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġcom . n ha ar man . mockito _ kotlin . verify Ċ import Ġcom . n ha ar man . mockito _ kotlin . verify No More Interactions Ċ import Ġorg . junit . Test Ċ Ċ class ĠState Store Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` state Ġimmediately Ġemitted Ġwhen Ġsubscribed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe ( subscriber ) ĊĊĠĠĠĠĠĠĠ Ġverify ( subscriber )( 2 3 ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( subscriber ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` subscriber Ġnot Ġnotified Ġafter Ġun sub scri bing `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġsubscription Ġ= Ġstore . subscribe ( subscriber ) ĊĊĠĠĠĠĠĠĠ Ġsubscription . unsubscribe () ĊĠĠĠĠĠĠĠ Ġstore . dispatch Ġ{ Ġit Ġ* Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify ( subscriber )( 2 3 ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( subscriber ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` subscribers Ġgets Ġnotified Ġif Ġstate Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe ( subscriber ) ĊĠĠĠĠĠĠĠ Ġstore . dispatch Ġ{ Ġit Ġ* Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( subscriber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( subscriber )( 2 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( subscriber )( 4 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions ( subscriber ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` state Ġnot Ġemitted Ġwhen Ġnot Ġchanged `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe ( subscriber ) ĊĠĠĠĠĠĠĠ Ġstore . dispatch Ġ{ Ġ 2 3 Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( subscriber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( subscriber )( 2 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify No More Interactions ( subscriber ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġhave Ġchild Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Subscriber : Ġ( String ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġchild Store Ġ= Ġstore . sub State (" string ") Ġ{ Ġ" Hello , ĠWorld !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Lens ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ Ġit . second Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġvalue : ĠString Ġ-> Ġ{ Ġstate : ĠPair < Int , ĠString > Ġ-> Ġstate . copy ( second Ġ= Ġvalue ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġval Ġgrand child Subscriber : Ġ( Long ) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġgrand Child Store Ġ= Ġchild Store . sub State (" long ") Ġ{ Ġ- 1 L Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Lens ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ Ġit . second Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġvalue : ĠLong Ġ-> Ġ{ Ġstate : ĠPair < String , ĠLong > Ġ-> Ġstate . copy ( second Ġ= Ġvalue ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe ( subscriber ) ĊĠĠĠĠĠĠĠ Ġchild Store . subscribe ( child Subscriber ) ĊĠĠĠĠĠĠĠ Ġgrand Child Store . subscribe ( grand child Subscriber ) ĊĊĠĠĠĠĠĠĠ Ġstore . dispatch Ġ{ Ġit Ġ* Ġ 2 Ġ} ĊĠĠĠĠĠĠĠ Ġchild Store . dispatch Ġ{ Ġ" Good bye , ĠWorld !" Ġ} ĊĠĠĠĠĠĠĠ Ġgrand Child Store . dispatch Ġ{ Ġit Ġ+ Ġ 2 3 L Ġ} ĊĊĠĠĠĠĠĠĠ Ġin Order ( subscriber , Ġchild Subscriber , Ġgrand child Subscriber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( subscriber )( 2 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( child Subscriber )(" Hello , ĠWorld !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( grand child Subscriber )( - 1 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( subscriber )( 4 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( child Subscriber )(" Good bye , ĠWorld !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( grand child Subscriber )( 2 2 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` deep Ġstates `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFirst ( val Ġroot : ĠPair < Pair < Pair < Pair < Int , ĠString >, ĠInt >, ĠLong >, ĠUnit >, Ġval Ġf ifth : ĠPair < Int , ĠInt >) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSecond ( val Ġroot : ĠPair < Pair < Pair < Int , ĠString >, ĠInt >, ĠLong >, Ġval Ġfourth : ĠUnit , Ġval Ġf ifth : ĠPair < Int , ĠInt >) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠThird ( val Ġroot : ĠPair < Pair < Int , ĠString >, ĠInt >, Ġval Ġthird : ĠLong , Ġval Ġfourth : ĠUnit , Ġval Ġf ifth : ĠPair < Int , ĠInt >) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFour th ( val Ġroot : ĠPair < Int , ĠString >, Ġval Ġsecond : ĠInt , Ġval Ġthird : ĠLong , Ġval Ġfourth : ĠUnit , Ġval Ġf ifth : ĠPair < Int , ĠInt >) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFlat ten ed State ( val Ġroot : ĠInt , Ġval Ġfirst : ĠString , Ġval Ġsecond : ĠInt , Ġval Ġthird : ĠLong , Ġval Ġfourth : ĠUnit , Ġval Ġf ifth : ĠPair < Int , ĠInt >) ĊĊĠĠĠĠĠĠĠ Ġval Ġflatten Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLens < Pair < Pair < Pair < Pair < Pair < Int , ĠString >, ĠInt >, ĠLong >, ĠUnit >, ĠPair < Int , ĠInt >>, ĠFirst >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ ĠFirst ( root Ġ= Ġit . first , Ġf ifth Ġ= Ġit . second ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġfirst Ġ-> Ġ{ Ġstate Ġ-> Ġstate . copy ( first Ġ= Ġfirst . root ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLens < First , ĠSecond >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ ĠSecond ( root Ġ= Ġit . root . first , Ġfourth Ġ= Ġit . root . second , Ġf ifth Ġ= Ġit . f ifth ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġsecond Ġ-> Ġ{ Ġfirst Ġ-> Ġfirst . copy ( root Ġ= ĠPair ( second . root , Ġsecond . four th ), Ġf ifth Ġ= Ġsecond . f ifth ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLens < Second , ĠThird >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ ĠThird ( root Ġ= Ġit . root . first , Ġthird Ġ= Ġit . root . second , Ġfourth Ġ= Ġit . four th , Ġf ifth Ġ= Ġit . f ifth ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġthird Ġ-> Ġ{ Ġsecond Ġ-> Ġsecond . copy ( root Ġ= ĠPair ( third . root , Ġthird . third ), Ġfourth Ġ= Ġthird . four th , Ġf ifth Ġ= Ġthird . f ifth ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLens < Third , ĠFour th >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ ĠFour th ( root Ġ= Ġit . root . first , Ġsecond Ġ= Ġit . root . second , Ġthird Ġ= Ġit . third , Ġfourth Ġ= Ġit . four th , Ġf ifth Ġ= Ġit . f ifth ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġfourth Ġ-> Ġ{ Ġthird Ġ-> Ġthird . copy ( root Ġ= ĠPair ( four th . root , Ġfourth . second ), Ġthird Ġ= Ġfourth . third , Ġfourth Ġ= Ġfourth . four th , Ġf ifth Ġ= Ġfourth . f ifth ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLens < Four th , ĠFlat ten ed State >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ= Ġ{ ĠFlat ten ed State ( root Ġ= Ġit . root . first , Ġfirst Ġ= Ġit . root . second , Ġsecond Ġ= Ġit . second , Ġthird Ġ= Ġit . third , Ġfourth Ġ= Ġit . four th , Ġf ifth Ġ= Ġit . f ifth ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ= Ġ{ Ġstate Ġ-> Ġ{ Ġfourth Ġ-> Ġfourth . copy ( root Ġ= ĠPair ( state . root , Ġstate . first ), Ġsecond Ġ= Ġstate . second , Ġthird Ġ= Ġstate . third , Ġfourth Ġ= Ġstate . four th , Ġf ifth Ġ= Ġstate . f ifth ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠState Store ( 2 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub State (" first ") Ġ{ Ġ" 1 " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub State (" second ") Ġ{ Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub State (" third ") Ġ{ Ġ 3 L Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub State ( 4 ) Ġ{ ĠUnit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub State ( 5 L ) Ġ{ ĠPair ( 1 , Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsubscriber : Ġ( Pair < Pair < Pair < Pair < Pair < Int , ĠString >, ĠInt >, ĠLong >, ĠUnit >, ĠPair < Int , ĠInt >>) Ġ-> ĠUnit Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠPair ( Pair ( Pair ( Pair ( Pair ( 2 3 , Ġ" 1 "), Ġ 2 ), Ġ 3 L ), ĠUnit ), Ġ 1 Ġto Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmapped Store Ġ= Ġstore . map ( flatten ) ĊĠĠĠĠĠĠĠ Ġval Ġmapped Subscriber : Ġ( Flatten ed State ) Ġ-> ĠUnit Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe ( subscriber ) ĊĠĠĠĠĠĠĠ Ġmapped Store . subscribe ( mapped Subscriber ) ĊĠĠĠĠĠĠĠ Ġverify ( subscriber )( expected ) ĊĠĠĠĠĠĠĠ Ġverify ( mapped Subscriber )( flatten ( expected )) ĊĊĠĠĠ Ġ} Ċ }