package Ġio . msp encer . k runch Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ interface ĠReader < Self Ġ: ĠReader < Self , ĠT >, ĠT Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġval Ġat End : ĠBoolean ĊĠĠĠ Ġval Ġindex : ĠInt ĊĊĠĠĠ Ġval Ġfirst : ĠT ? ĊĊĠĠĠ Ġfun Ġremainder ( next Index : ĠInt ): ĠSelf ĊĊĠĠĠ Ġfun Ġ< R > Ġok ( match : ĠR , Ġnext Index : ĠInt ): ĠResult < Self , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Ok ( match , Ġindex , Ġremainder ( next Index )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< R > Ġerror ( message : ĠString ): ĠResult < Self , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Error ( message , Ġindex , Ġthis Ġas ĠSelf ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< R > Ġfail ( message : ĠString ): ĠResult < Self , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Failure ( message , Ġindex , Ġthis Ġas ĠSelf ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext (): ĠResult < Self , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( at End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfail (" Unexpected Ġend Ġof Ġinput !") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġfirst Ġ?: Ġif Ġ( at End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfail (" Unexpected Ġend Ġof Ġinput !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror (" Unexpected Ġnull Ġinput !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġok ( next , Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< A Ġ: ĠT > Ġtake ( expected : ĠA ): ĠResult < Self , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( at End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfail (" Expected Ġ'$ expected ' Ġbefore Ġend Ġof Ġfile !") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġfirst Ġ?: Ġif Ġ( at End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfail (" Expected Ġ'$ expected ' Ġbefore Ġend Ġof Ġfile !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror (" Unexpected Ġnull Ġinput !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġexpected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġok ( next Ġas ĠA , Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfail (" Expected Ġ'$ expected ', Ġgot : Ġ'$ next ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< A Ġ: ĠT > Ġtake ( type : ĠK Class < A >): ĠResult < Self , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnext (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Ok Ġ-> Ġwhen Ġ( it . matched :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ-> Ġit . cast () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Expected Ġtoken Ġof Ġtype Ġ'${ type . simple Name }', Ġgot : Ġ'${ it . matched }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit . cast () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }