package Ġcom . github . j corn az . kw ik . generator . stdlib Ċ Ċ import Ġcom . github . j corn az . kw ik . generator . api . Generator Ċ import Ġcom . github . j corn az . kw ik . generator . api . random Sequence Ċ import Ġkotlin . random . Random Ċ Ċ private Ġconst Ġval ĠMAX _ EXTRA _ ADD _ AT TEMP T Ġ= Ġ 1 0 0 0 Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ List ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ[ min Size ] Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* Ġ@ param Ġelement Gen ĠGenerator Ġto Ġuse Ġfor Ġelements Ġin Ġthe Ġlist Ċ Ġ*/ Ċ fun Ġ< T > ĠGenerator . Companion . lists ( ĊĠĠĠ Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= Ġmax Of ( min Size , ĠK WI K _ DEFAULT _ MAX _ SIZE ) Ċ ): ĠGenerator < List < T >> Ġ= ĠList Generator ( element Gen , Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ List ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ 1 Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* Ġ@ param Ġelement Gen ĠGenerator Ġto Ġuse Ġfor Ġelements Ġin Ġthe Ġlist Ċ Ġ*/ Ċ fun Ġ< T > ĠGenerator . Companion . non Empty Lists ( ĊĠĠĠ Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < List < T >> Ġ= ĊĠĠĠ Ġlists ( element Gen , Ġ 1 , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ List ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠGenerator . Companion . lists ( ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < List < T >> Ġ= ĊĠĠĠ Ġlists ( Generator . default (), Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ List ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠGenerator . Companion . non Empty Lists ( maxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE ): ĠGenerator < List < T >> Ġ= ĊĠĠĠ Ġlists ( Generator . default (), Ġ 1 , ĠmaxSize ) Ċ Ċ private Ġclass ĠList Generator < T >( ĊĠĠĠ Ġprivate Ġval Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ Ġprivate Ġval Ġmin Size : ĠInt , ĊĠĠĠ Ġprivate Ġval ĠmaxSize : ĠInt Ċ ) Ġ: ĠGenerator < List < T >> Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsamples : ĠSet < List < T >> Ġ= Ġmutable Set Of < List < T >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ== Ġ 0 ) Ġadd ( emptyList ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ<= Ġ 1 Ġ&& ĠmaxSize Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Gen . samples . forEach Ġ{ Ġadd ( listOf ( it )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid Sizes ( min Size , ĠmaxSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( random : ĠRandom ): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ ĠList ( random . nextInt ( min Size , ĠmaxSize Ġ+ Ġ 1 )) Ġ{ Ġelement Gen . generate ( random ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ Set ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ[ min Size ] Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġdomain Ġof Ġthe Ġelements Ġis Ġtoo Ġsmall , Ġthis Ġgenerator Ġmay Ġfail Ġafter Ġtoo Ġmany Ġattempt Ġto Ġcreate Ġa Ġset Ġof Ġ[ min Size ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġelement Gen ĠGenerator Ġto Ġuse Ġfor Ġelements Ġin Ġthe Ġset Ċ Ġ*/ Ċ fun Ġ< T > ĠGenerator . Companion . sets ( ĊĠĠĠ Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= Ġmax Of ( min Size , ĠK WI K _ DEFAULT _ MAX _ SIZE ) Ċ ): ĠGenerator < Set < T >> Ġ= ĠSet Generator ( element Gen , Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ Set ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ 1 Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* Ġ@ param Ġelement Gen ĠGenerator Ġto Ġuse Ġfor Ġelements Ġin Ġthe Ġset Ċ Ġ*/ Ċ fun Ġ< T > ĠGenerator . Companion . non Empty Sets ( ĊĠĠĠ Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < Set < T >> Ġ= Ġsets ( element Gen , Ġ 1 , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ Set ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠGenerator . Companion . sets ( ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < Set < T >> Ġ= ĊĠĠĠ Ġsets ( Generator . default (), Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ Set ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠGenerator . Companion . non Empty Sets ( maxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE ): ĠGenerator < Set < T >> Ġ= ĊĠĠĠ Ġsets ( Generator . default (), Ġ 1 , ĠmaxSize ) Ċ Ċ private Ġclass ĠSet Generator < T >( ĊĠĠĠ Ġprivate Ġval Ġelement Gen : ĠGenerator < T >, ĊĠĠĠ Ġprivate Ġval Ġmin Size : ĠInt , ĊĠĠĠ Ġprivate Ġval ĠmaxSize : ĠInt Ċ ) Ġ: ĠGenerator < Set < T >> Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġsamples : ĠSet < Set < T >> Ġ= Ġmutable Set Of < Set < T >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ== Ġ 0 ) Ġadd ( empty Set ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ<= Ġ 1 Ġ&& ĠmaxSize Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Gen . samples . forEach Ġ{ Ġadd ( set Of ( it )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid Sizes ( min Size , ĠmaxSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( random : ĠRandom ): ĠSet < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġrandom . nextInt ( min Size , ĠmaxSize Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠHashSet < T >( size ) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ+= Ġelement Gen . generate ( random ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġextra Attempt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( set . size Ġ< Ġsize Ġ&& Ġextra Attempt Ġ< ĠMAX _ EXTRA _ ADD _ AT TEMP T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ+= Ġelement Gen . generate ( random ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ extra Attempt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( set . size Ġ< Ġmin Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġcreate Ġa Ġset Ġwith Ġthe Ġrequested Ġminimum Ġof Ġelement ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġset ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ Map ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ[ min Size ] Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġdomain Ġof Ġthe Ġkeys Ġis Ġtoo Ġsmall , Ġthis Ġgenerator Ġmay Ġfail Ġafter Ġtoo Ġmany Ġattempt Ġto Ġcreate Ġa Ġset Ġof Ġ[ min Size ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġkey Gen ĠGenerator Ġto Ġuse Ġfor Ġkeys Ġin Ġthe Ġmap Ċ Ġ* Ġ@ param Ġvalue Gen ĠGenerator Ġto Ġuse Ġfor Ġvalues Ġin Ġthe Ġmap Ċ Ġ*/ Ċ fun Ġ< K , ĠV > ĠGenerator . Companion . maps ( ĊĠĠĠ Ġkey Gen : ĠGenerator < K >, ĊĠĠĠ Ġvalue Gen : ĠGenerator < V >, ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= Ġmax Of ( min Size , ĠK WI K _ DEFAULT _ MAX _ SIZE ) Ċ ): ĠGenerator < Map < K , ĠV >> Ġ= ĠMap Generator ( key Gen , Ġvalue Gen , Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ Map ] Ġwhere Ġsizes Ġare Ġall Ġbetween Ġ 1 Ġand Ġ[ maxSize ] Ġ( inclusive ) Ċ Ġ* Ċ Ġ* Ġ@ param Ġkey Gen ĠGenerator Ġto Ġuse Ġfor Ġkeys Ġin Ġthe Ġmap Ċ Ġ* Ġ@ param Ġvalue Gen ĠGenerator Ġto Ġuse Ġfor Ġvalues Ġin Ġthe Ġmap Ċ Ġ*/ Ċ fun Ġ< K , ĠV > ĠGenerator . Companion . non Empty Maps ( ĊĠĠĠ Ġkey Gen : ĠGenerator < K >, ĊĠĠĠ Ġvalue Gen : ĠGenerator < V >, ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < Map < K , ĠV >> Ġ= Ġmaps ( key Gen , Ġvalue Gen , Ġ 1 , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġ[ Map ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠK , Ġre ified ĠV > ĠGenerator . Companion . maps ( ĊĠĠĠ Ġmin Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < Map < K , ĠV >> Ġ= ĊĠĠĠ Ġmaps ( Generator . default (), ĠGenerator . default (), Ġmin Size , ĠmaxSize ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġgenerator Ġof Ġnon - empty Ġ[ Map ] Ġusing Ġa Ġdefault Ġgenerator Ġfor Ġthe Ġelements Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠK , Ġre ified ĠV > ĠGenerator . Companion . non Empty Maps ( ĊĠĠĠ ĠmaxSize : ĠInt Ġ= ĠK WI K _ DEFAULT _ MAX _ SIZE Ċ ): ĠGenerator < Map < K , ĠV >> Ġ= ĊĠĠĠ Ġmaps ( Generator . default (), ĠGenerator . default (), Ġ 1 , ĠmaxSize ) Ċ Ċ private Ġclass ĠMap Generator < K , ĠV >( ĊĠĠĠ Ġprivate Ġval Ġkey Gen : ĠGenerator < K >, ĊĠĠĠ Ġprivate Ġval Ġvalue Gen : ĠGenerator < V >, ĊĠĠĠ Ġprivate Ġval Ġmin Size : ĠInt , ĊĠĠĠ Ġprivate Ġval ĠmaxSize : ĠInt Ċ ) Ġ: ĠGenerator < Map < K , ĠV >> Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġsamples : ĠSet < Map < K , ĠV >> Ġ= Ġmutable Set Of < Map < K , ĠV >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ== Ġ 0 ) Ġadd ( empty Map ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ<= Ġ 1 Ġ&& ĠmaxSize Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġ( value Gen . samples . as Sequence () Ġ+ Ġvalue Gen . random Sequence ( 0 )). iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Gen . samples . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( map Of ( it Ġto Ġvalues . next ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid Sizes ( min Size , ĠmaxSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( random : ĠRandom ): ĠMap < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġrandom . nextInt ( min Size , ĠmaxSize Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < K , ĠV >( size ) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key Gen . generate ( random )] Ġ= Ġvalue Gen . generate ( random ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġextra Attempt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( map . size Ġ< Ġsize Ġ&& Ġextra Attempt Ġ< ĠMAX _ EXTRA _ ADD _ AT TEMP T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key Gen . generate ( random )] Ġ= Ġvalue Gen . generate ( random ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ extra Attempt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( map . size Ġ< Ġmin Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġcreate Ġa Ġset Ġwith Ġthe Ġrequested Ġminimum Ġof Ġelement ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġrequire Valid Sizes ( min Size : ĠInt , ĠmaxSize : ĠInt ) Ġ{ ĊĠĠĠ Ġrequire ( min Size Ġ>= Ġ 0 ) Ġ{ Ġ" Invalid Ġmin Ġsize : Ġ$ min Size " Ġ} ĊĠĠĠ Ġrequire ( maxSize Ġ>= Ġmin Size ) Ġ{ Ġ" Invalid Ġmin - max Ġsizes : Ġmin =$ maxSize Ġmax =$ min Size " Ġ} Ċ } Ċ