package Ġorg . dr x . plugin . al ge br ai ctypes . extension Ċ Ċ import Ġorg . dr x . plugin . al ge br ai ctypes . config . Config Ċ import Ġorg . dr x . plugin . al ge br ai ctypes . generate . keys Package Ċ import Ġorg . dr x . plugin . al ge br ai ctypes . generate . package Case Ċ Ċ open Ġclass ĠModule Extension Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġsource Folder : ĠString ĊĠĠĠ Ġlateinit Ġvar Ġdomain : ĠString ĊĠĠĠ Ġvar Ġproduct Types : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsum Types : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdual ities : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġproduct Type Ar ith met ics : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġe vo leq Sum s : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġe vo leq Products : ĠDimension Selection ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġoutputs : ĠOutputs Ġ= ĠOutputs () ĊĠĠĠ Ġval Ġkeys : ĠArrayList < Keys > Ġ= Ġarray ListOf () ĊĠĠĠ Ġvar Ġdata Classes : ĠData Classes ? Ġ= Ġnull Ċ } Ċ Ċ @ Algebra ic Types Dsl Ċ fun ĠAl gebra ic Types Extension . source Set ( configuration : ĠModule Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġmodule Ġ= ĠModule Extension () ĊĠĠĠ Ġmodule . configuration () ĊĠĠĠ Ġwith ( module ) Ġmodule Extension @{ ĊĠĠĠĠĠĠĠ Ġ// Ġalgebra ic Ġtypes ĊĠĠĠĠĠĠĠ Ġthis @ source Set . product Types Ġ= Ġthis @ module Extension . merge ( this @ source Set . product Types , Ġproduct Types ) ĊĠĠĠĠĠĠĠ Ġthis @ source Set . sum Types Ġ= Ġthis @ module Extension . merge ( this @ source Set . sum Types , Ġsum Types ) ĊĠĠĠĠĠĠĠ Ġthis @ source Set . dual ities Ġ= Ġthis @ module Extension . merge ( this @ source Set . dual ities , Ġdual ities ) ĊĠĠĠĠĠĠĠ Ġthis @ source Set . product Type Ar ith met ics Ġ= Ġthis @ module Extension . merge ( this @ source Set . product Type Ar ith met ics , Ġproduct Type Ar ith met ics ) ĊĠĠĠĠĠĠĠ Ġthis @ source Set . e vo leq Sum s Ġ= Ġthis @ module Extension . merge ( this @ source Set . e vo leq Sum s , Ġe vo leq Sum s ) ĊĠĠĠĠĠĠĠ Ġthis @ source Set . e vo leq Products Ġ= Ġthis @ module Extension . merge ( this @ source Set . e vo leq Products , Ġe vo leq Products ) ĊĠĠĠĠĠĠĠ Ġif ( keys Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ source Set . keys . addAll ( this @ module Extension . keys . mod ular ize ( this @ module Extension )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdata Ġclasses ĊĠĠĠĠĠĠĠ Ġthis @ source Set . data Classes Ġ= Ġthis @ module Extension . merge ( this @ source Set . data Classes , Ġdata Classes ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠModule Extension . merge ( base : ĠDimension Selection ?, Ġintegr and : ĠDimension Selection ?): ĠDimension Selection . Complex ? Ġ= ĊĠĠĠ Ġif ( integr and Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠ Ġwith ( integr and . complex ify (). mod ular ize ( this @ merge )) Ġintegr and @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( base Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ integr and ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( base Ġas ĠDimension Selection . Complex ). list . addAll ( this . list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġbase Ġas ĠDimension Selection . Complex ? ĊĠĠĠ Ġ} Ċ Ċ fun ĠModule Extension . merge ( base : ĠData Classes ?, Ġintegr and : ĠData Classes ?): ĠData Classes ? Ġ= ĊĠĠĠ Ġif ( integr and Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠ Ġwith ( integr and . mod ular ize ( this @ merge )) Ġintegr and @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( base Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ integr and ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase . data Classes . addAll ( integr and . data Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase . sealed Classes . addAll ( integr and . sealed Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġadd Ġothers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġbase ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcomplex Ġdimension - selection Ġcontaining Ġonly Ġsingle Ġselections Ċ Ġ*/ Ċ fun ĠDimension Selection . complex ify (): ĠDimension Selection . Complex Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠ Ġis ĠDimension Selection . Complex Ġ-> Ġwith ( Dimension Selection . Complex ( array ListOf (), source Folder , ĠpackageName )){ ĊĠĠĠĠĠĠĠ Ġthis @ complex ify . list . forEach Ġ{ Ġselection Ġ-> Ġthis . list . addAll ( Ġselection . complex ify (). list Ġ) Ġ} ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠDimension Selection . List Ġ-> ĠDimension Selection . Complex ( ĊĠĠĠĠĠĠĠ Ġarray ListOf (* list . map { Ġx Ġ-> ĠDimension Selection . Single ( x , source Folder , packageName )}. to Typed Array ()), ĊĠĠĠĠĠĠĠ Ġsource Folder , ĊĠĠĠĠĠĠĠ Ġdomain , ĊĠĠĠĠĠĠĠ ĠpackageName ĊĠĠĠ Ġ) ĊĠĠĠ Ġis ĠDimension Selection . Range Ġ-> ĠDimension Selection . Complex ( ĊĠĠĠĠĠĠĠ Ġarray ListOf (*( from .. to ). map Ġ{ ĠDimension Selection . Single ( it , source Folder , ĠpackageName ) Ġ}. to Typed Array ()), ĊĠĠĠĠĠĠĠ Ġsource Folder , ĊĠĠĠĠĠĠĠ Ġdomain , ĊĠĠĠĠĠĠĠ ĠpackageName ĊĠĠĠ Ġ) ĊĠĠĠ Ġis ĠDimension Selection . Single Ġ-> ĠDimension Selection . Complex ( array ListOf ( this ), ĊĠĠĠĠĠĠĠ Ġsource Folder , ĊĠĠĠĠĠĠĠ Ġdomain , ĊĠĠĠĠĠĠĠ ĠpackageName ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAss umes Ġthat Ġselection list Ġonly Ġcontains ĠSingle Ġselections Ċ Ġ*/ Ċ fun ĠDimension Selection . Complex . mod ular ize ( module Extension : ĠModule Extension ): ĠDimension Selection . Complex Ġ= Ġwith ( Dimension Selection . Complex ( ĊĠĠĠ Ġarray ListOf (), ĊĠĠĠ Ġmodule Extension . source Folder , ĊĠĠĠ Ġmodule Extension . domain , ĊĠĠĠ ĠpackageName ĊĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . addAll ( array ListOf (* this @ mod ular ize . list . map { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ-> ĠDimension Selection . Single ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( selection Ġas ĠDimension Selection . Single ). dimension , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Folder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Extension . domain , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . Generated Sources . Algebra ic Types . packageName Ġ+ Ġ"." Ġ+ Ġselection . packageName Ġ// Ġtodo Ġthink Ġabout Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array ())) ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} Ċ Ċ fun ĠData Classes . mod ular ize ( module Extension : ĠModule Extension ) Ġ: ĠData Classes Ġ= Ġwith ( Data Classes ()) Ġ{ ĊĠĠĠ Ġthis @ mod ular ize . data Classes . forEach Ġ{ Ġdata Class Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . data Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġdata Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . addAll ( data Class . comment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Folder Ġ= Ġmodule Extension . source Folder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ= Ġmodule Extension . domain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġdata Class . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . addAll ( data Class . parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ters Post Fix Ġ= Ġdata Class . set ters Post Fix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserial izable Ġ= Ġdata Class . serial izable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialization Type Ġ= Ġdata Class . serialization Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġthis @ mod ular ize . sealed Classes . forEach Ġ{ Ġsealed Class Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . sealed Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġsealed Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . addAll ( sealed Class . comment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Folder Ġ= Ġmodule Extension . source Folder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ= Ġmodule Extension . domain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġsealed Class . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . addAll ( sealed Class . parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepresent atives . addAll ( sealed Class . represent atives ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ters Post Fix Ġ= Ġsealed Class . set ters Post Fix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserial izable Ġ= Ġsealed Class . serial izable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialization Type Ġ= Ġsealed Class . serialization Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġthis Ċ } Ċ Ċ fun ĠArrayList < Keys >. mod ular ize ( module Extension : ĠModule Extension ): ĠArrayList < Keys > Ġ= Ġwith ( Keys Extension ()) Ġ{ ĊĠĠĠ Ġthis @ mod ular ize . forEach Ġ{ Ġkey Ġ-> Ġkey Group Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġkey . name ĊĠĠĠĠĠĠĠ Ġnumber Ġ= Ġkey . number ĊĠĠĠĠĠĠĠ Ġserialization Ġ= Ġkey . serialization ĊĠĠĠĠĠĠĠ Ġsource Folder Ġ= Ġmodule Extension . source Folder ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġmodule Extension . domain ĊĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġ"${ Config . Generated Sources . Algebra ic Types . packageName }${ when ( key . packageName ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ". ${ key . packageName }" ĊĠĠĠĠĠĠĠ Ġ} Ġ} ". package Case () Ġ// Ġtodo Ġthink Ġabout Ġthis ĊĠĠĠ Ġ} Ġ} ĊĠĠĠ Ġkeys Ċ } Ċ Ċ /** Ċ Ġ* ĠProducts Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . products ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġproduct Types Ġ= Ġextension . dimension Selection Ċ } Ċ /** Ċ Ġ* ĠSum s Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . sums ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġsum Types Ġ= Ġextension . dimension Selection Ċ } Ċ Ċ /** Ċ Ġ* ĠProduct - Ar ith met ics Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . product Ar ith met ics ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġproduct Type Ar ith met ics Ġ= Ġextension . dimension Selection Ċ } Ċ Ċ /** Ċ Ġ* ĠE vo leq ĠProducts Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . e vo leq Products ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġe vo leq Products Ġ= Ġextension . dimension Selection Ċ } Ċ Ċ /** Ċ Ġ* ĠE vo leq ĠSum s Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . e vo leq Sum s ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġe vo leq Sum s Ġ= Ġextension . dimension Selection Ċ } Ċ Ċ /** Ċ Ġ* ĠDual ities Ġd sl Ċ Ġ*/ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . dual ities ( configuration : ĠDimension Selection Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠDimension Selection Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġdual ities Ġ= Ġextension . dimension Selection Ċ } Ċ Ċ /** Ċ Ġ* ĠKey Groups Ġd sl Ċ Ġ*/ Ċ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . key Groups ( configuration : ĠKeys Extension . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= ĠKeys Extension () ĊĠĠĠ Ġextension . configuration () ĊĠĠĠ Ġkeys . addAll ( extension . keys ) Ċ } Ċ Ċ @ Algebra ic Types Dsl Ċ fun ĠModule Extension . data Classes ( configuration : ĠData Classes . ()-> Unit ) Ġ{ ĊĠĠĠ Ġval Ġdata Classes Ġ= ĠData Classes () ĊĠĠĠ Ġdata Classes . configuration () ĊĠĠĠ Ġthis . data Classes Ġ= Ġdata Classes Ċ } ĊĊĊĊĊ