package Ġsilent orb . my th ic . bloom Ċ Ċ import Ġsilent orb . my th ic . spatial . Vector 2 i Ċ import Ġkotlin . math . max Ċ Ċ type alias ĠSimple Box Container Ġ= Ġ( List < Box >) Ġ-> ĠBox Ċ Ċ data Ġclass ĠHalf Box ( ĊĠĠĠ Ġval Ġoffset : ĠInt , ĊĠĠĠ Ġval Ġlength : ĠInt , Ċ ) Ċ Ċ tail rec Ġfun Ġarrange Lengths ( spacing : ĠInt , Ġlengths : ĠList < Int >, Ġtotal Length : ĠInt Ġ= Ġ 0 , Ġaccumulator : ĠList < Half Box > Ġ= ĠlistOf ()): ĠList < Half Box > Ġ= ĊĠĠĠ Ġif Ġ( lengths . none ()) ĊĠĠĠĠĠ Ġaccumulator ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġlength Ġ= Ġlengths . first () ĊĠĠĠĠĠ Ġval Ġnext Length Ġ= Ġtotal Length Ġ+ Ġlength Ġ+ Ġspacing ĊĠĠĠĠĠ Ġarrange Lengths ( spacing , Ġlengths . drop ( 1 ), Ġnext Length , Ġaccumulator Ġ+ ĠHalf Box ( total Length , Ġlength )) ĊĠĠĠ Ġ} Ċ Ċ tail rec Ġfun Ġarrange List Items ( plane : ĠPlane , Ġspacing : ĠInt , Ġboxes : ĠList < Box >, Ġlength : ĠInt Ġ= Ġ 0 , Ġaccumulator : ĠList < Offset Box > Ġ= ĠlistOf ()): ĠList < Offset Box > Ġ= ĊĠĠĠ Ġif Ġ( boxes . none ()) ĊĠĠĠĠĠ Ġaccumulator ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġbox Ġ= Ġboxes . first () ĊĠĠĠĠĠ Ġval Ġchild Dimensions Ġ= Ġplane ( box . dimensions ) ĊĠĠĠĠĠ Ġval Ġnext Length Ġ= Ġlength Ġ+ Ġchild Dimensions . x Ġ+ Ġspacing ĊĠĠĠĠĠ Ġarrange List Items ( plane , Ġspacing , Ġboxes . drop ( 1 ), Ġnext Length , Ġaccumulator Ġ+ ĠOffset Box ( box , Ġplane ( Vector 2 i ( length , Ġ 0 )))) ĊĠĠĠ Ġ} Ċ Ċ fun ĠgetList Length ( boxes : ĠList < Half Box >): ĠInt Ġ= ĊĠĠĠ Ġboxes . max Of OrNull Ġ{ Ġit . offset Ġ+ Ġit . length Ġ} Ġ?: Ġ 0 Ċ Ċ fun ĠgetList Length ( plane : ĠPlane , Ġboxes : ĠList < Offset Box >): ĠInt Ġ= ĊĠĠĠ Ġboxes . max Of OrNull Ġ{ Ġplane ( it . offset Ġ+ Ġit . dimensions ). x Ġ} Ġ?: Ġ 0 Ċ Ċ fun ĠgetList B read th 2 ( plane : ĠPlane , Ġboxes : ĠList < Offset Box >): ĠInt Ġ= ĊĠĠĠ Ġboxes . max Of OrNull Ġ{ Ġplane ( it . offset Ġ+ Ġit . dimensions ). y Ġ} Ġ?: Ġ 0 Ċ Ċ fun ĠgetList B read th ( plane : ĠPlane , Ġboxes : ĠList < Dimension Box >): ĠInt Ġ= ĊĠĠĠ Ġboxes . max Of OrNull Ġ{ Ġplane ( it . dimensions ). y Ġ} Ġ?: Ġ 0 Ċ Ċ fun Ġbox List ( plane : ĠPlane , Ġspacing : ĠInt , Ġvar arg Ġchildren : ĠBox ): ĠBox Ġ{ ĊĠ Ġval Ġboxes Ġ= Ġarrange List Items ( plane , Ġspacing , Ġchildren . toList ()) ĊĠ Ġval Ġlength Ġ= ĠgetList Length ( plane , Ġboxes ) ĊĠ Ġval Ġb read th Ġ= ĠgetList B read th ( plane , Ġboxes . map Ġ{ Ġit . child Ġ}) ĊĊĠ Ġreturn ĠBox ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" list ", ĊĠĠĠĠĠ Ġdimensions Ġ= Ġplane ( Vector 2 i ( length , Ġb read th )), ĊĠĠĠĠĠ Ġboxes Ġ= Ġboxes ĊĠ Ġ) Ċ } Ċ Ċ fun Ġbox List 2 ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 , Ġvar arg Ġchildren : ĠBox ) Ġ= ĊĠĠĠ Ġbox List ( plane , Ġspacing , Ġ* children ) Ċ Ċ fun Ġbox List ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 ): ĠSimple Box Container Ġ= Ġ{ Ġchildren Ġ-> ĊĠ Ġbox List ( plane , Ġspacing , Ġ* children . to Typed Array ()) Ċ } Ċ Ċ fun Ġalign List Items ( plane : ĠPlane , Ġalign : ĠAlign er ): Ġ( Box ) Ġ-> ĠBox Ġ= Ġ{ Ġbox Ġ-> ĊĠ Ġval Ġb read th Ġ= ĠgetList B read th ( plane , Ġbox . boxes . map Ġ{ Ġit . child Ġ}) ĊĠ Ġbox . copy ( ĊĠĠĠĠĠ Ġboxes Ġ= Ġbox . boxes . map Ġ{ Ġchild Offset Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġlength Offset Ġ= Ġplane ( child Offset . offset ). x ĊĠĠĠĠĠĠĠ Ġval Ġaligned Ġ= Ġalign ( bread th , Ġplane ( child Offset . dimensions ). y ) ĊĠĠĠĠĠĠĠ Ġchild Offset . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġplane ( Vector 2 i ( length Offset , Ġaligned )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ Ċ fun Ġb read th List ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 , Ġfit Children : ĠBoolean Ġ= Ġtrue ): Ġ( List < Length Flow er >) Ġ-> ĠLength Flow er Ġ= Ġ{ Ġchildren Ġ-> ĊĠ Ġ{ Ġb read th Ġ-> ĊĠĠĠ Ġval Ġinitial Boxes Ġ= Ġchildren . map Ġ{ Ġit ( bread th ) Ġ} ĊĠĠĠ Ġval Ġboxes Ġ= Ġarrange List Items ( plane , Ġspacing , Ġinitial Boxes ) ĊĠĠĠ Ġval Ġlength Ġ= ĠgetList Length ( plane , Ġboxes ) ĊĠĠĠ Ġval Ġchildren B read th Ġ= ĠgetList B read th 2 ( plane , Ġboxes ) ĊĠĠĠ Ġif Ġ( fit Children Ġ&& Ġchildren B read th Ġ> Ġb read th ) ĊĠĠĠĠĠ Ġb read th List ( plane , Ġspacing , Ġfalse )( children )( children B read th ) ĊĠĠĠ Ġelse ĊĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" list ", ĊĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġplane ( Vector 2 i ( length , Ġb read th )), ĊĠĠĠĠĠĠĠĠĠ Ġboxes Ġ= Ġboxes ĊĠĠĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġf lower List ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 ): Ġ( List < Flow er >) Ġ-> ĠF lower Ġ= Ġ{ Ġchildren Ġ-> ĊĠ Ġ{ Ġseed Ġ-> ĊĠĠĠ Ġval Ġinitial Boxes Ġ= Ġchildren . map Ġ{ Ġit ( seed ) Ġ} ĊĠĠĠ Ġval Ġboxes Ġ= Ġarrange List Items ( plane , Ġspacing , Ġinitial Boxes ) ĊĠĠĠ Ġval Ġlength Ġ= ĠgetList Length ( plane , Ġboxes ) ĊĠĠĠ Ġval Ġb read th Ġ= ĠgetList B read th 2 ( plane , Ġboxes ) ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" list ", ĊĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġplane ( Vector 2 i ( length , Ġb read th )), ĊĠĠĠĠĠĠĠ Ġboxes Ġ= Ġboxes ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġf lower Box List ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 ): Ġ( List < Flow er Or Box >) Ġ-> ĠF lower Ġ= Ġ{ Ġchildren Ġ-> ĊĠ Ġ{ Ġseed Ġ-> ĊĠĠĠ Ġval Ġreserved Length Ġ= Ġchildren ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit Ġas ? ĠBox Ġ} ĊĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġplane ( it . dimensions ). x Ġ} Ġ+ ĊĠĠĠĠĠĠĠ Ġ( children . size Ġ- Ġ 1 ) Ġ* Ġspacing ĊĊĠĠĠ Ġval Ġchild Seed Ġ= Ġseed . copy ( ĊĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġseed . dimensions Ġ- Ġplane ( Vector 2 i ( reserved Length , Ġ 0 )), ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġinitial Boxes Ġ= Ġchildren . map Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġis ĠBox ) ĊĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġelse Ġ( it Ġas ĠF lower )( child Seed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġboxes Ġ= Ġarrange List Items ( plane , Ġspacing , Ġinitial Boxes ) ĊĠĠĠ Ġval Ġlength Ġ= ĠgetList Length ( plane , Ġboxes ) ĊĠĠĠ Ġval Ġb read th Ġ= ĠgetList B read th 2 ( plane , Ġboxes ) ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" flower Box List ", ĊĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġplane ( Vector 2 i ( length , Ġb read th )), ĊĠĠĠĠĠĠĠ Ġboxes Ġ= Ġboxes ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġhorizontal List ( spacing : ĠInt Ġ= Ġ 0 ): ĠSimple Box Container Ġ= ĊĠĠĠ Ġbox List ( horizontal Plane , Ġspacing ) Ċ Ċ interface ĠFlex Item Ġ{ ĊĠ Ġfun Ġget Box ( length : ĠInt , Ġb read th : ĠInt ): ĠBox ĊĠ Ġfun Ġget Box OrNull (): ĠBox ? Ċ } Ċ Ċ data Ġclass ĠBox Flex Item ( ĊĠĠĠ Ġval Ġbox : ĠBox Ċ ) Ġ: ĠFlex Item Ġ{ ĊĠ Ġoverride Ġfun Ġget Box ( length : ĠInt , Ġb read th : ĠInt ): ĠBox Ġ= Ġbox ĊĠ Ġoverride Ġfun Ġget Box OrNull (): ĠBox ? Ġ= Ġbox Ċ } Ċ Ċ data Ġclass ĠLength Flex Item ( ĊĠĠĠ Ġval Ġf lower : ĠLength Flow er Ċ ) Ġ: ĠFlex Item Ġ{ ĊĠ Ġoverride Ġfun Ġget Box ( length : ĠInt , Ġb read th : ĠInt ): ĠBox Ġ= Ġf lower ( length ) ĊĠ Ġoverride Ġfun Ġget Box OrNull (): ĠBox ? Ġ= Ġnull Ċ } Ċ Ċ data Ġclass ĠF lower Flex Item ( ĊĠĠĠ Ġval Ġf lower : ĠF lower Ċ ) Ġ: ĠFlex Item Ġ{ ĊĠ Ġoverride Ġfun Ġget Box ( length : ĠInt , Ġb read th : ĠInt ): ĠBox Ġ= Ġf lower ( Seed ( Vector 2 i ( length , Ġb read th ))) ĊĠ Ġoverride Ġfun Ġget Box OrNull (): ĠBox ? Ġ= Ġnull Ċ } Ċ Ċ fun Ġflex ( box : ĠBox ): ĠFlex Item Ġ= ĊĠĠĠ ĠBox Flex Item ( box ) Ċ Ċ fun Ġflex ( flower : ĠLength Flow er ): ĠFlex Item Ġ= ĊĠĠĠ ĠLength Flex Item ( flower ) Ċ Ċ fun Ġflex Flow er ( flower : ĠF lower ): ĠFlex Item Ġ= ĊĠĠĠ ĠF lower Flex Item ( flower ) Ċ Ċ fun Ġflex List ( plane : ĠPlane , Ġspacing : ĠInt Ġ= Ġ 0 ): Ġ( List < Flex Item >) Ġ-> ĠLength Flow er Ġ= Ġ{ Ġchildren Ġ-> ĊĠ Ġ{ Ġlength Ġ-> ĊĠĠĠ Ġval Ġinput Boxes Ġ= Ġchildren . map NotNull Ġ{ Ġit . get Box OrNull () Ġ} ĊĠĠĠ Ġif Ġ( input Boxes . size Ġ== Ġchildren . size ) ĊĠĠĠĠĠ Ġbox List ( plane , Ġspacing )( input Boxes ) ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġfixed Length Ġ= Ġinput Boxes . sum By Ġ{ Ġplane ( it . dimensions ). x Ġ} ĊĠĠĠĠĠ Ġval Ġb read th Ġ= Ġinput Boxes . sum By Ġ{ Ġplane ( it . dimensions ). y Ġ} ĊĠĠĠĠĠ Ġval Ġtotal Spacing Ġ= Ġspacing Ġ* Ġ( children . size Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġval Ġreserved Ġ= Ġfixed Length Ġ+ Ġtotal Spacing ĊĠĠĠĠĠ Ġval Ġremaining Ġ= Ġlength Ġ- Ġreserved ĊĠĠĠĠĠ Ġval Ġstretch Count Ġ= Ġchildren . size Ġ- Ġinput Boxes . size ĊĠĠĠĠĠ Ġval Ġstretch R ation Ġ= Ġremaining Ġ/ Ġstretch Count ĊĠĠĠĠĠ Ġval Ġboxes Ġ= Ġchildren . map Ġ{ Ġit . get Box ( stretch R ation , Ġb read th ) Ġ} ĊĠĠĠĠĠ Ġval Ġarrange d Boxes Ġ= Ġarrange List Items ( plane , Ġspacing , Ġboxes ) ĊĠĠĠĠĠ Ġval Ġfinal Length Ġ= Ġmax ( length , Ġreserved ) ĊĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" flex List ", ĊĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġplane ( Vector 2 i ( final Length , Ġb read th )), ĊĠĠĠĠĠĠĠĠĠ Ġboxes Ġ= Ġarrange d Boxes ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ