package Ġstore . tools Ċ Ċ import Ġcom . ark iv an ov . mv ik otlin . core . store . Executor Ċ import Ġcom . ark iv an ov . mv ik otlin . core . store . Reducer Ċ import Ġcom . ark iv an ov . mv ik otlin . core . store . Store Ċ import Ġcom . ark iv an ov . mv ik otlin . core . store . Store Factory Ċ import Ġcom . ark iv an ov . mv ik otlin . core . utils . Jvm Serializable Ċ import Ġcom . bad oo . reak t ive . utils . ensure Never Frozen Ċ import Ġmodel .* Ċ import Ġstore . tools . Grid Store .* Ċ Ċ abstract Ġclass ĠGrid Store Abstract Factory ( ĊĠ Ġprivate Ġval Ġstore Factory : ĠStore Factory , ĊĠ Ġdata : ĠResearch S lices Sizes Data New Ċ ) Ġ{ ĊĊĠ Ġval ĠinitialState : ĠState Ġ= ĠState ( ĊĠĠĠ Ġlist Ġ= ĠlistOf ( ĊĠĠĠĠĠ Ġinitial Single Grid ( data . type ), ĊĠĠĠĠĠ Ġinitial Two Vertical Grid ( data . type ), ĊĠĠĠĠĠ Ġinitial Two Horizontal Grid ( data . type ), ĊĠĠĠĠĠ Ġinitial Four Grid ( data . type ) ĊĠĠĠ Ġ), ĊĠĠĠ Ġcurrent Ġ= Ġinitial Four Grid ( data . type ), ĊĠĠĠ Ġprevious Ġ= Ġnull ĊĠ Ġ) ĊĊĠ Ġfun Ġcreate (): ĠGrid Store Ġ= ĊĠĠĠ Ġobject Ġ: ĠGrid Store , ĠStore < Intent , ĠState , ĠLabel > Ġby Ġstore Factory . create ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Grid Store ", ĊĠĠĠĠĠ ĠinitialState Ġ= ĠinitialState , ĊĠĠĠĠĠ Ġexecutor Factory Ġ= Ġ:: create Executor , ĊĠĠĠĠĠ Ġreducer Ġ= ĠRed ucer Impl ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Never Frozen () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprotected Ġabstract Ġfun Ġcreate Executor (): ĠExecutor < Intent , ĠNothing , ĠState , ĠResult , ĠLabel > ĊĠ Ġprotected Ġsealed Ġclass ĠResult Ġ: ĠJ vm Serializable Ġ{ ĊĠĠĠ Ġdata Ġclass ĠGrid Changed ( val Ġgrid : ĠGrid ) Ġ: ĠResult () ĊĠĠĠ Ġdata Ġclass ĠGrid Changed Temporary ( val Ġprevious : ĠGrid , Ġval Ġcurrent : ĠGrid ) Ġ: ĠResult () ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠRed ucer Impl Ġ: ĠRed ucer < State , ĠResult > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠState . reduce ( result : ĠResult ): ĠState Ġ= ĊĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠResult . Grid Changed Ġ-> Ġcopy ( current Ġ= Ġresult . grid , Ġprevious Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġis ĠResult . Grid Changed Temporary Ġ-> Ġcopy ( current Ġ= Ġresult . current , Ġprevious Ġ= Ġresult . previous ) ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġ} Ċ } Ċ