package Ġme . sem oro . parse kt ĊĊ Ċ class ĠStr DataSource ( val Ġsequence : ĠCharSequence ) Ġ: ĠDataSource () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġpos Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlimit Ġ= ĠInt . MAX _ VALUE ĊĠĠĠ Ġoverride Ġfun Ġseek Abs ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpos Ġ= Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġposition (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadvance () Ġ{ ĊĠĠĠĠĠĠĠ Ġpos ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpos Ġ< Ġsequence . length Ġ&& Ġpos Ġ< Ġlimit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence [ pos ++] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpeek (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence [ pos ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠMatch Range . text (): ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence . sub Sequence ( this . start , Ġthis . end ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Limit ( limit : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . limit Ġ= Ġlimit ĊĠĠĠ Ġ} Ċ Ċ } ĊĊĊ Ċ class ĠDebug DataSource ( ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠStr DataSource , ĊĠĠĠ Ġprivate Ġval Ġdebug Peek : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġdebug Next : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġdebug Advance : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġdebug Seek : ĠBoolean Ġ= Ġtrue Ċ ): ĠDataSource () Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġprintln State () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠ Ġfor Ġ( trace Ġin ĠThread . currentThread (). stack Trace . drop ( 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" at Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( trace ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" ---------------- ----------- ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġseek Abs ( position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( debug Seek ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( delegate . sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Underline ( position (), Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . seek Abs ( position ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġposition (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . position () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw Underline ( from : ĠInt , Ġto : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint (" Ġ". repeat ( min Of ( to , Ġfrom ))) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ> Ġto Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" âĶ ĸ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" âĶĢ ". repeat ( from Ġ- Ġto Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" âĶ ĺ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ< Ġto Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" âĶĶ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" âĶĢ ". repeat ( to Ġ- Ġfrom Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" âĶ ļ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" âĨ º ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( delegate . sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Underline ( position (), Ġposition () Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadvance () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Advance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( delegate . sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Underline ( position (), Ġposition () Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . advance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpeek (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Peek ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( delegate . sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Ġ". repeat ( position ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("^ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . peek () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate . hasNext () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Limit ( limit : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . set Limit ( limit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠMatch Range . text (): ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( delegate ) Ġ{ Ġtext () Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ abstract Ġclass ĠRange Access Ġ{ ĊĠĠĠ Ġabstract Ġfun ĠMatch Range . text (): ĠCharSequence Ċ } Ċ Ċ abstract Ġclass ĠDataSource Ġ: ĠRange Access () Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġseek Abs ( position : ĠInt ) ĊĠĠĠ Ġabstract Ġfun Ġposition (): ĠInt ĊĠĠĠ Ġabstract Ġfun Ġnext (): ĠChar ĊĠĠĠ Ġabstract Ġfun Ġadvance () ĊĠĠĠ Ġabstract Ġfun Ġpeek (): ĠChar ĊĠĠĠ Ġabstract Ġfun Ġhas Next (): ĠBoolean ĊĠĠĠ Ġabstract Ġfun Ġset Limit ( limit : ĠInt ) Ċ } Ċ