data Ġclass ĠPoint ( val Ġx : ĠInt Ġ= Ġ 0 , Ġval Ġy : ĠInt Ġ= Ġ 0 ) Ċ { ĊĠĠĠ Ġfun Ġplus ( d : ĠDirection ) Ġ= ĠPoint ( x Ġ+ Ġd . shift . x , Ġy Ġ+ Ġd . shift . y ) ĊĠĠĠ Ġfun Ġminus ( d : ĠDirection ) Ġ= ĠPoint ( x Ġ+ Ġd . shift . x , Ġy Ġ+ Ġd . shift . y ) ĊĊĠĠĠ Ġcompanion Ġobject ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġzero Ġ= ĠPoint () ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠDirection ( val Ġshift : ĠPoint ) Ċ { ĊĠĠĠ ĠNone ( Point . zero ), ĊĠĠĠ ĠUp ( Point ( 0 , Ġ 1 )), ĊĠĠĠ ĠLeft ( Point (- 1 , Ġ 0 )), ĊĠĠĠ ĠDown ( Point ( 0 , Ġ- 1 )), ĊĠĠĠ ĠRight ( Point ( 1 , Ġ 0 )) Ċ } Ċ Ċ data Ġclass ĠVector ( val Ġx : ĠDouble Ġ= Ġ 0 . 0 , Ġval Ġy : ĠDouble Ġ= Ġ 0 . 0 ) Ċ { ĊĠĠĠ Ġcompanion Ġobject ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġzero Ġ= ĠVector () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠInt . clamp ( min : ĠInt , Ġmax : ĠInt ) Ġ= ĊĠĠĠ Ġwhen ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ< Ġmin Ġ-> Ġmin ĊĠĠĠĠĠĠĠ Ġthis Ġ> Ġmax Ġ-> Ġmax ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ}