package Ġxyz . dav ids imon . inter akt . field Ċ Ċ import Ġorg . j line . keymap . Binding Reader Ċ import Ġorg . j line . keymap . Key Map Ċ import Ġorg . j line . reader . Line Reader Ċ import Ġorg . j line . terminal . Terminal Ċ import Ġorg . j line . utils . Attribut ed StringBuilder Ċ import Ġorg . j line . utils . Attribut ed Style Ċ import Ġorg . j line . utils . Info Cmp Ċ import Ġxyz . dav ids imon . inter akt .* Ċ import Ġxyz . dav ids imon . inter akt . util . cyan Ċ import Ġxyz . dav ids imon . inter akt . util . delete Lines Above Ċ import Ġxyz . dav ids imon . inter akt . util . format Prompt Message Ċ import Ġxyz . dav ids imon . inter akt . util . wrap Around Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . util .* Ċ Ċ open Ġclass ĠList Field < T >( ĊĠĠĠ Ġoverride Ġval Ġprompt Message : ĠString , ĊĠĠĠ Ġval Ġchoices : Ġ( Prompt Result ) Ġ-> ĠList < Choice < T >>, ĊĠĠĠ Ġoverride Ġval Ġshould Prompt : Ġ( Prompt Result , ĠList < T > ?) Ġ-> ĠBoolean , ĊĠĠĠ Ġoverride Ġval Ġdefault : Ġ( Prompt Result , ĠList < T > ?) Ġ-> ĠList < T >? Ċ ) Ġ: ĊĠĠĠ ĠStateful Field < List < T >, ĠList Field . Render State < T >> Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠChoice < T >( val Ġname : ĠString , Ġval Ġvalue : ĠT ) ĊĠĠĠ Ġclass ĠNo Choices Exception ( message : ĠString ) Ġ: ĠPrompt Exception ( message ) ĊĊĠĠĠ Ġenum Ġclass ĠList Operations Ġ{ ĊĠĠĠĠĠĠĠ ĠUP , ĊĠĠĠĠĠĠĠ ĠDOWN , ĊĠĠĠĠĠĠĠ ĠSELECT , ĊĠĠĠĠĠĠĠ ĠSUB MIT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRender State < T >( ĊĠĠĠĠĠĠĠ Ġval Ġchoices : ĠMutable List < Choice < T >>, ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Row : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġval Ġselected Rows : ĠBit Set Ġ= ĠBit Set ( choices . size ), ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġis Submitted : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ: ĠStateful Field . Render State ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠonSelect ( state : ĠRender State < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . selected Rows . flip ( state . current Row ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon KeyUp ( state : ĠRender State < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . current Row Ġ= Ġ( state . current Row Ġ- Ġ 1 ). wrap Around ( 0 , Ġstate . choices . last Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon KeyDown ( state : ĠRender State < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . current Row Ġ= Ġ( state . current Row Ġ+ Ġ 1 ). wrap Around ( 0 , Ġstate . choices . last Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit State ( pr : ĠPrompt Result ): ĠRender State < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchoices Ġ= Ġchoices ( pr ) ĊĠĠĠĠĠĠĠ Ġif Ġ( choices . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNo Choices Exception (" no Ġchoices Ġsupplied Ġfor Ġfield ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠRender State ( choices . to Mutable List ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdefaults Ġ= Ġdefault ( pr , Ġpr [ this ]) ĊĠĠĠĠĠĠĠ Ġval Ġdefault Indexes Ġ= Ġchoices . with Index (). filter Ġ{ Ġdefaults ?. contains ( it . value . value ) Ġ== Ġtrue }. map Ġ{ Ġit . index Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( index Ġin Ġdefault Indexes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . selected Rows . set ( index , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrender ( ĊĠĠĠĠĠĠĠ Ġpr : ĠPrompt Result , ĊĠĠĠĠĠĠĠ Ġterminal : ĠTerminal , ĊĠĠĠĠĠĠĠ Ġline Reader : ĠLine Reader , ĊĠĠĠĠĠĠĠ Ġbinding Reader : ĠBinding Reader , ĊĠĠĠĠĠĠĠ Ġwriter : ĠPrintWriter ĊĠĠĠ Ġ): ĠList < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġkey map Ġ= ĠKey Map < List Operations >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( List Operations . UP , ĠKey Map . key ( terminal , ĠInfo Cmp . Capability . key _ up )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( List Operations . DOWN , ĠKey Map . key ( terminal , ĠInfo Cmp . Capability . key _ down )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( List Operations . SELECT , Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( List Operations . SUBMIT , Ġ"\ r ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwriter . println ( format Prompt Message ( prompt Message )) ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Term Attrs Ġ= Ġterminal . enter Raw Mode () ĊĠĠĠĠĠĠĠ Ġterminal . puts ( Info Cmp . Capability . key pad _ x mit ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġinit State ( pr ) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! state . is Submitted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġstate . choices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . println ( format List Choice ( index , Ġstate )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . flush () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( binding Reader . read Binding ( keymap )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Operations . UP Ġ-> Ġon KeyUp ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Operations . DOWN Ġ-> Ġon KeyDown ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Operations . SELECT Ġ-> ĠonSelect ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Operations . SUBMIT , Ġnull Ġ-> ĠonSubmit ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġterminal . puts ( Info Cmp . Capability . parm _ up _ cursor , Ġstate . choices . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġterminal . puts ( Info Cmp . Capability . parm _ delete _ line , Ġstate . choices . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġterminal . attributes Ġ= Ġoriginal Term Attrs ĊĠĠĠĠĠĠĠ Ġterminal . puts ( Info Cmp . Capability . key pad _ local ) ĊĠĠĠĠĠĠĠ Ġterminal . flush () ĊĊĠĠĠĠĠĠĠ Ġval ĠretVal Ġ= Ġstate . choices . with Index (). filter Ġ{ Ġstate . selected Rows [ it . index ] Ġ}. map Ġ{ Ġit . value . value Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġret Name Ġ= Ġstate . choices . get OrNull ( state . current Row )?. name ĊĊĠĠĠĠĠĠĠ Ġterminal . delete Lines Above ( 1 ) ĊĠĠĠĠĠĠĠ Ġwriter . println ("${ format Prompt Message ( prompt Message )} Ġ${ cyan ( ret Name Ġ?: Ġ"") }") ĊĊĠĠĠĠĠĠĠ Ġterminal . delete Lines Above ( 1 ) ĊĠĠĠĠĠĠĠ Ġwriter . println ("${ format Prompt Message ( prompt Message )} Ġ${ cyan ( ret Name Ġ?: Ġ"") }") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠretVal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġformat List Choice ( index : ĠInt , Ġstate : ĠRender State < T >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhighlighted Ġ= Ġstate . current Row Ġ== Ġindex ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġstate . selected Rows [ index ] ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġstate . choices [ index ]. name ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAt tribut ed StringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( highlighted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle ( Attribut ed Style . DEFAULT . foreground ( Attribut ed Style . CY AN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Platform Symbols . POINTER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Platform Symbols . TICK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ]") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ}. to Ansi () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠPrompt . list ( ĊĠĠĠ Ġmessage : ĠString , ĊĠĠĠ Ġchoices : Ġ( Prompt Result ) Ġ-> ĠList < List Field . Choice < T >>, ĊĠĠĠ Ġshould Prompt : Ġ(( Prompt Result , ĠList < T > ?) Ġ-> ĠBoolean ) Ġ= Ġprompt If Null (), ĊĠĠĠ Ġdefault : Ġ(( Prompt Result , ĠList < T > ?) Ġ-> ĠList < T > ?) Ġ= Ġdefault Null () Ċ ): ĠList Field < T > Ġ= ĊĠĠĠ Ġadd Field ( List Field ( message , Ġchoices , Ġshould Prompt , Ġdefault )) Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠPrompt . list ( ĊĠĠĠ Ġmessage : ĠString , ĊĠĠĠ Ġchoices : ĠList < List Field . Choice < T >>, ĊĠĠĠ Ġshould Prompt : Ġ(( Prompt Result , ĠList < T > ?) Ġ-> ĠBoolean ) Ġ= Ġprompt If Null (), ĊĠĠĠ Ġdefault : Ġ(( Prompt Result , ĠList < T > ?) Ġ-> ĠList < T > ?) Ġ= Ġdefault Null () Ċ ): ĠList Field < T > Ġ= ĊĠĠĠ Ġadd Field ( List Field ( message , Ġ{ Ġchoices Ġ}, Ġshould Prompt , Ġdefault ))