package Ġjump aku . commons . history Ċ Ċ import Ġjump aku . commons . control . None Ċ import Ġjump aku . commons . control . Option Ċ import Ġjump aku . commons . control . Some Ċ import Ġjump aku . commons . control . to Option Ċ import Ġkotlin . math . min ĊĊ Ċ class ĠHistory < Mem ento Ġ: ĠAny , ĠAction Ġ: Ġ( Option < Mem ento >) Ġ-> ĠM ement o > Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġcurrent : ĠOption < Mem ento >, ĊĠĠĠ Ġprivate Ġval Ġprev : ĠList < Mem ento >, ĊĠĠĠ Ġprivate Ġval Ġnext : ĠList < Mem ento >, ĊĠĠĠ Ġval Ġcommands : ĠList < Command < Mem ento , ĠAction >> Ċ ) Ġ{ ĊĠĠĠ Ġconstructor () Ġ: Ġthis ( None , Ġempty List (), Ġempty List (), Ġempty List ()) ĊĊĠĠĠ Ġprivate Ġval Ġundo : ĠCommand . Undo < Mem ento , ĠAction > Ġ= ĠCommand . Undo () ĊĊĠĠĠ Ġprivate Ġval Ġredo : ĠCommand . Redo < Mem ento , ĠAction > Ġ= ĠCommand . Redo () ĊĊĠĠĠ Ġfun Ġexec ( command : ĠCommand < Mem ento , ĠAction >): ĠHistory < Mem ento , ĠAction > Ġ= Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCommand . Do Ġ-> ĠHistory ( Some ( command . action ( current )), Ġcurrent Ġ+ Ġprev , Ġempty List (), Ġcommands Ġ+ Ġcommand ) ĊĠĠĠĠĠĠĠ Ġis ĠCommand . Undo Ġ-> ĠHistory ( prev . first OrNull (). to Option (), Ġprev . drop ( min ( 1 , Ġprev . size )), Ġcurrent Ġ+ Ġnext , Ġcommands Ġ+ Ġcommand ) ĊĠĠĠĠĠĠĠ Ġis ĠCommand . Redo Ġ-> Ġif Ġ( next . isEmpty ()) Ġthis Ġelse ĠHistory ( Some ( next . first ()), Ġcurrent Ġ+ Ġprev , Ġnext . drop ( 1 ), Ġcommands Ġ+ Ġcommand ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo (): ĠHistory < Mem ento , ĠAction > Ġ= Ġexec ( undo ) ĊĊĠĠĠ Ġfun Ġredo (): ĠHistory < Mem ento , ĠAction > Ġ= Ġexec ( redo ) ĊĊĠĠĠ Ġfun Ġdo Action ( action : ĠAction ): ĠHistory < Mem ento , ĠAction > Ġ= Ġexec ( Command . Do ( action )) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< Mem ento Ġ: ĠAny , ĠAction Ġ: Ġ( Option < Mem ento >) Ġ-> ĠM ement o > Ġreproduce ( commands : ĠList < Command < Mem ento , ĠAction >>) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠHistory < Mem ento , ĠAction > Ġ= Ġcommands . fold ( History ()) Ġ{ Ġh , Ġc Ġ-> Ġh . exec ( c ) Ġ} ĊĠĠĠ Ġ} Ċ }