package Ġorg . jav ier mf . primitives . isbn Ċ Ċ import Ġorg . jav ier mf . primitives . exceptions . message Ċ Ċ data Ġclass ĠIs bn ( val Ġis bn : ĠString ) Ġ{ ĊĊĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġis bn . trim (). replace ("- ", Ġ""). replace (" Ġ", Ġ"") ĊĊĠĠĠ Ġval Ġoriginal Ġ= Ġis bn ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( value . length Ġin Ġset Of ( 1 0 , Ġ 1 3 )) Ġ{ Ġmessage (" The Ġis bn Ġhas Ġnot Ġthe Ġproper Ġlength Ġ( 1 0 Ġor Ġ 1 3 )") Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( ĠisValid ( value ) Ġ){ Ġmessage (" The Ġis bn Ġis Ġinvalid ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġoriginal ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠIs bn Ġ&& Ġother . value Ġ== Ġthis . value ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġvalue . hashCode () ĊĊĠĠĠ Ġprivate Ġfun ĠisValid ( tri med Is bn : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tri med Is bn . length Ġ== Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Is bn 1 0 ( tri med Is bn ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Is bn 1 3 ( tri med Is bn ) ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Is bn 1 3 ( tri med Is bn : ĠString )= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtri med Is bn . map Ġ{ Ġit Ġ- Ġ' 0 ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index Ġ% Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 3 Ġ* Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum () Ġ% Ġ 1 0 Ġ== Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Is bn 1 0 ( tri med Is bn : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġall Ġcore Ġis bn Ġmust Ġbe Ġnumbers ĊĠĠĠĠĠĠĠ Ġtri med Is bn . drop Last ( 1 ). toInt OrNull () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Digit Ġis Ġa Ġnumber Ġor Ġan ĠX ĊĠĠĠĠĠĠĠ Ġtri med Is bn . last (). take If Ġ{ Ġit . is Digit () Ġ|| Ġit Ġ== Ġ' X ' Ġ} Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġtri med Is bn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it Ġ== Ġ' X ') Ġ 1 0 Ġelse Ġit Ġ- Ġ' 0 ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold Indexed ( 0 ){ Ġind , Ġacc , Ġn Ġ-> Ġacc Ġ+ Ġ( 1 0 Ġ- Ġind ) Ġ* Ġn Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( sum Ġ% Ġ 1 1 ) Ġ== Ġ 0 ĊĠĠĠ Ġ} Ċ } ĊĊ