package Ġnor swap . aut umn . undo able Ċ import Ġnor swap . aut umn . Grammar Ċ import Ġnor swap . aut umn . Side Effect Ċ import Ġnor swap . aut umn . undo Ċ import Ġjava . util . HashMap Ċ Ċ /** Ċ Ġ* ĠA Ġmap Ġwhose Ġmutations Ġcause Ġ[ Side Effect ] s Ġto Ġbe Ġapplied Ġto Ġ[ grammar ]. Ċ Ġ*/ Ċ class ĠUndo Map < K , ĠV > Ġ( val Ġgrammar : ĠGram mar , Ġval Ġmap : ĠHashMap < K , ĠV > Ġ= ĠHashMap ()): ĠMap < K , ĠV > Ġby Ġmap Ċ { ĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAssoci ates Ġ[ value ] Ġto Ġ[ key ], Ġreturning Ġthe Ġold Ġvalue , Ġif Ġany , Ġand Ġnull Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġput Ġ( key : ĠK , Ġvalue : ĠV ): ĠV ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmap [ key ] ĊĠĠĠĠĠĠĠ Ġgrammar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġundo Ġ{ Ġif Ġ( old Ġ== Ġnull ) Ġmap . remove ( key ) Ġelse Ġmap . put ( key , Ġold ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġold ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġkey Ġand Ġits Ġassociated Ġvalue , Ġif Ġany , Ġfrom Ġthe Ġmap . ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġold Ġvalue , Ġif Ġany , Ġand Ġnull Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Ġ( key : ĠK ): ĠV ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmap [ key ] ĊĠĠĠĠĠĠĠ Ġgrammar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġundo Ġ{ Ġif Ġ( old Ġ!= Ġnull ) Ġmap . put ( key , Ġold ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġold ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- Ċ }