package Ġnl . jh vh . s udoku . format . box format Ċ Ċ /* ĠCopyright Ġ 2 0 2 0 ĠJan - H end rik Ġvan ĠHe us den ĊĊĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ import Ġnl . jh vh . s udoku . format . Format table . Format table List Ċ import Ġnl . jh vh . s udoku . format . element . Block Formatting Ċ import Ġnl . jh vh . s udoku . format . right Border Is Block Border Ċ import Ġnl . jh vh . s udoku . grid . model . cell . Cell Ċ import Ġnl . jh vh . s udoku . grid . model . segment . Block Ċ import Ġnl . jh vh . s udoku . util . concat Each Ċ Ċ /** Ċ Ġ* ĠFormatter Ġto Ġformat Ġa Ġ[ Block ] Ġusing Ġbox Ġdrawing Ġcharacters Ġand Ġnumbers . ĠStateless . Ċ Ġ* Ġ Ġ* ĠBox Ġdrawing Ġcharacters : Ġâķĳ ĠâĶĤ Ġâķ Ĳ Ġ âĶĢ Ġâķ Ķ Ġâķ Ĺ Ġâķ ļ Ġâķ Ŀ Ġâķ ¤ Ġâķ § Ġâķ ¦ Ġâķ © Ġâķ Ł Ġâķ ¢ Ġâķ ł Ġâķ £ Ġâķ ¬ ĠâĶ ¼ Ġâķ ª Ġâķ « Ġetc . Ċ Ġ* Ċ Ġ* ĠTypically Ġfor Ġconsole Ġoutput , Ġto Ġobserve Ġresults Ġof Ġactions Ġ( block Ġconstruction , ĠS udoku Ġsolving , Ċ Ġ* Ġtesting Ġetc .) Ċ Ġ*/ Ċ class ĠBlock Box Formatter Ġ( private Ġval Ġcell Box Formatter : ĠCell Box Formatter ) Ġ: ĠBlock Formatting , ĠGrid Element Box Formatter < Block > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġformat ( block : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn aked With Top And Bottom Ġ= Ġget Top Border ( block ) Ġ+ Ġn aked Format ( block ) Ġ+ Ġget Bottom Border ( block ) ĊĠĠĠĠĠĠĠ Ġval Ġleft Border Ġ= ĠlistOf ( get Top Left Edge ( block )) Ġ+ Ġget Left Border ( block ) Ġ+ ĠlistOf ( get Bottom Left Edge ( block )) ĊĠĠĠĠĠĠĠ Ġval Ġright Border Ġ= ĠlistOf ( get Top Right Edge ( block )) Ġ+ Ġget Right Border ( block ) Ġ+ ĠlistOf ( get Bottom Right Edge ( block )) ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( left Border Ġconcat Each Ġn aked With Top And Bottom Ġconcat Each Ġright Border ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġn aked Format ( element : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġ// ĠBlock Ġhas Ġn Ġsub - rows Ġ( n Ġ= ĠblockSize ; Ġsub - row Ġas ĠCell s Ġof Ġa ĠRow Ġin so far Ġthese ĠCell s Ġare Ġpart Ġof Ġthe ĠBlock ) ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġ 2 Ġlists - of - lists Ġwith Ġidentical Ġstructure , Ġ 1 Ġwith Ġcells , Ġ 1 Ġwith Ġformatted Ġcells ĊĠĠĠĠĠĠĠ Ġval Ġcells By Sub Row Ġ= Ġmutable ListOf ( mutable ListOf < Cell >()) ĊĠĠĠĠĠĠĠ Ġval Ġformatted Cell sBy Sub Row Ġ= Ġmutable ListOf < Format table List >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġblock . grid . block Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcells By Sub Row . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcells By Sub Row [ x ]. addAll ( block . cells . filter Ġ{ Ġx Ġ== Ġit . rowIndex Ġ- Ġblock . top RowIndex Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Cell sWith Right Border Ġ= Ġconcat Each (* cell sBy Sub Row [ x ]. drop Last ( 1 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Box Formatter . n aked Format ( it ) Ġconcat Each Ġcell Box Formatter . get Right Border ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Cell N aked Ġ= Ġcell Box Formatter . n aked Format ( cell sBy Sub Row [ x ]. last ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Cell sBy Sub Row . add ( Format table List ( left Cell sWith Right Border Ġconcat Each Ġright Cell N aked )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġblock . grid . block Size - 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġbottom Ġborder Ġ( except Ġfor Ġlast Ġsub - row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Border Ġ= Ġconcat Each (* cell sBy Sub Row [ x ]. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Box Formatter . get Bottom Border ( it ) Ġconcat Each ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . right Border Is Block Border ()) ĠlistOf ("") Ġelse ĠlistOf ( cell Box Formatter . get Bottom Right Edge ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Cell sBy Sub Row . add ( Format table List ( bottom Border )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( formatted Cell sBy Sub Row . flatten ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Left Border ( element : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġleft Col Cells Ġ= Ġblock . cells . filter Ġ{ Ġit . col Index Ġ== Ġblock . left Col Index Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġleft Col Cells . drop Last ( 1 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( cell Box Formatter . get Left Border ( it ) Ġ+ ĠlistOf ( cell Box Formatter . get Bottom Left Edge ( it ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . addAll ( cell Box Formatter . get Left Border ( left Col Cells . last ())) ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Right Border ( element : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġright Col Cells Ġ= Ġblock . cells . filter Ġ{ Ġit . col Index Ġ== Ġblock . right Col Index Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġright Col Cells . drop Last ( 1 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( cell Box Formatter . get Right Border ( it ) Ġ+ ĠlistOf ( cell Box Formatter . get Bottom Right Edge ( it ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . addAll ( cell Box Formatter . get Right Border ( right Col Cells . last ())) ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Border ( element : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġtop Row Cells Ġ= Ġblock . cells . toList (). sub List ( 0 , Ġblock . grid . block Size ) ĊĠĠĠĠĠĠĠ Ġval Ġtop Border Ġ= Ġconcat Each (* top Row Cells . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Box Formatter . get Top Border ( it ) Ġconcat Each ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . right Border Is Block Border ()) ĠlistOf ("") Ġelse ĠlistOf ( cell Box Formatter . get Top Right Edge ( it )) ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( top Border ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Bottom Border ( element : ĠBlock ): ĠFormat table List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġbottom Row Cells Ġ= Ġblock . cells . toList (). sub List ( block . grid . grid Size Ġ- Ġblock . grid . block Size , Ġblock . grid . grid Size ) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Border Ġ= Ġconcat Each (* bottom Row Cells . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Box Formatter . get Bottom Border ( it ) Ġconcat Each ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . right Border Is Block Border ()) ĠlistOf ("") Ġelse ĠlistOf ( cell Box Formatter . get Bottom Right Edge ( it )) ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠFormat table List ( bottom Border ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Left Edge ( element : ĠBlock ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcell Box Formatter . get Top Left Edge ( element . cells . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Right Edge ( element : ĠBlock ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcell Box Formatter . get Top Right Edge ( element . cells . toList ()[ element . grid . block Size - 1 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Bottom Left Edge ( element : ĠBlock ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcell Box Formatter . get Bottom Left Edge ( element . cells . toList ()[ element . grid . grid Size Ġ- Ġelement . grid . block Size ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Bottom Right Edge ( element : ĠBlock ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcell Box Formatter . get Bottom Right Edge ( element . cells . last ()) ĊĠĠĠ Ġ} Ċ } Ċ