package Ġcom . one gravity . bloc . sample . traffic Ċ Ċ import Ġcom . one gravity . bloc . Stream Ċ import Ġcom . one gravity . bloc . bloc Ċ import Ġcom . one gravity . bloc . context . Bloc Context Ċ import Ġkotlinx . coroutines . delay Ċ Ċ data Ġclass ĠStreet State ( val Ġcars : ĠInt ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( cars : ĠInt ): ĠStreet State Ġ= ĠStreet State ( this . cars Ġ+ Ġcars ) ĊĠĠĠ Ġoperator Ġfun Ġminus ( cars : ĠInt ): ĠStreet State Ġ= ĠStreet State ( this . cars Ġ- Ġcars ) ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġcars . toString () Ċ } Ċ Ċ sealed Ġclass ĠStreet Event Ġ{ ĊĠĠĠ Ġobject ĠPlus Ġ: ĠStreet Event () ĊĠĠĠ Ġobject ĠMin us Ġ: ĠStreet Event () Ċ } Ċ Ċ class ĠStreet ( context : ĠB loc Context , Ġprivate Ġval Ġdelay : ĠLong ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġtraffic Light : ĠTraffic Light ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġb loc Ġ= Ġb loc < Street State , ĠStreet Event >( context , ĠStreet State ( 0 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġth unk Matching < Street Event . Plus > Ġ{ Ġ_, Ġaction , Ġdispatch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( Street Event . Plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraffic Light ?. add Car () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreduce Ġ{ Ġstate , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcars Ġ= Ġstate . cars ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStreet Event . Plus Ġ-> ĠStreet State ( cars Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStreet Event . Minus Ġ-> ĠStreet State (( cars Ġ- Ġ 1 ). coerce At Least ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstate : ĠStream < Street State > Ġ= Ġb loc ĊĊĠĠĠ Ġfun Ġset Traffic Light ( traffic Light : ĠTraffic Light ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . traffic Light Ġ= Ġtraffic Light ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcar In () Ġ{ ĊĠĠĠĠĠĠĠ Ġb loc . emit ( Street Event . Plus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcar Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġb loc . emit ( Street Event . Minus ) ĊĠĠĠ Ġ} Ċ }