/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 . ĠSun gh you k ĠB ae Ġ< sun gh you k . bae @ gmail . com > Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġdeb op 4 k . core . collections . per mutations ĊĊ Ċ val ĠNIL : ĠPer mutation < Any ?> Ġget () Ġ= ĠNil . instance () Ċ Ċ fun Ġ< E > Ġempty Per mutation (): ĠPer mutation < E > Ġ= ĠNil . instance () Ċ Ċ fun Ġ< E > Ġpermutation Of ( element : ĠE ): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element , Ġempty Per mutation ()) Ċ Ċ fun Ġ< E > Ġpermutation Of ( element : ĠE , Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element , Ġtail Func ) Ċ Ċ fun Ġ< E > Ġpermutation Of ( element 1 : ĠE , Ġelement 2 : ĠE ): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element 1 , Ġpermutation Of ( element 2 )) Ċ Ċ fun Ġ< E > Ġpermutation Of ( element 1 : ĠE , Ġelement 2 : ĠE , Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element 1 , Ġpermutation Of ( element 2 , Ġtail Func )) Ċ Ċ fun Ġ< E > Ġpermutation Of ( element 1 : ĠE , Ġelement 2 : ĠE , Ġelement 3 : ĠE ): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element 1 , Ġpermutation Of ( element 2 , Ġelement 3 )) Ċ Ċ fun Ġ< E > Ġpermutation Of ( element 1 : ĠE , Ġelement 2 : ĠE , Ġelement 3 : ĠE , Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > ĊĠĠĠ Ġ= Ġcons ( element 1 , Ġpermutation Of ( element 2 , Ġelement 3 , Ġtail Func )) Ċ Ċ fun Ġ< E > Ġpermutation Of ( var arg Ġelements : ĠE ): ĠPer mutation < E > Ġ= Ġpermutation Of ( elements . iterator ()) Ċ fun Ġ< E > Ġpermutation Of ( elements : ĠIterable < E >): ĠPer mutation < E > Ġ= Ġpermutation Of ( elements . iterator ()) Ċ fun Ġ< E > Ġpermutation Of ( iterator : ĠIterator < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠ Ġcons ( iterator . next (), Ġ{ Ġpermutation Of ( iterator ) Ġ}) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġempty Per mutation () ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< E > ĠIterator < E >. to Per mutation (): ĠPer mutation < E > Ġ= Ġpermutation Of ( this ) Ċ fun Ġ< E > ĠIterable < E >. to Per mutation (): ĠPer mutation < E > Ġ= Ġpermutation Of ( this . iterator ()) Ċ fun Ġ< E > ĠSequence < E >. to Per mutation (): ĠPer mutation < E > Ġ= Ġpermutation Of ( this . iterator ()) Ċ Ċ fun Ġ< E > Ġconcat ( elements : ĠIterable < E >, Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġconcat ( elements . iterator (), Ġtail Func ) Ċ } Ċ Ċ fun Ġ< E > Ġconcat ( elements : ĠIterable < E >, Ġtail : ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġconcat ( elements . iterator (), Ġtail ) Ċ } Ċ Ċ fun Ġ< E > Ġconcat ( iterator : ĠIterator < E >, Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠ Ġconcat Non Empty Iterator ( iterator , Ġtail Func ) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġtail Func () ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< E > Ġconcat ( iterator : ĠIterator < E >, Ġtail : ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠ Ġconcat Non Empty Iterator ( iterator , Ġtail ) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġtail ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< E > Ġconcat Non Empty Iterator ( iterator : ĠIterator < E >, Ġtail : ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġval Ġnext Ġ= Ġiterator . next () ĊĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠ Ġcons ( next , Ġconcat Non Empty Iterator ( iterator , Ġtail )) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġcons ( next , Ġtail ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< E > Ġconcat Non Empty Iterator ( iterator : ĠIterator < E >, Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġval Ġnext Ġ= Ġiterator . next () ĊĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠ Ġcons ( next , Ġconcat Non Empty Iterator ( iterator , Ġtail Func )) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġcons ( next , Ġtail Func ) ĊĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< E > Ġcons ( head : ĠE , Ġtail Func : Ġ() Ġ-> ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn ĠCons ( head , Ġtail Func ) Ċ } Ċ Ċ fun Ġ< E > Ġcons ( head : ĠE , Ġtail : ĠPer mutation < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn ĠFixed Cons ( head , Ġtail ) Ċ } Ċ Ċ fun Ġ< E > Ġiterate ( initial : ĠE , Ġfunc : Ġ( E ) Ġ-> ĠE ): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn ĠCons ( initial , Ġ{ Ġiterate ( func . invoke ( initial ), Ġfunc ) Ġ}) Ċ } Ċ Ċ fun Ġ< E > Ġtab ulate ( start : ĠInt , Ġgenerator : Ġ( Int ) Ġ-> ĠE ): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġcons ( generator ( start )) Ġ{ Ġtab ulate ( start Ġ+ Ġ 1 , Ġgenerator ) Ġ} Ċ } Ċ Ċ fun Ġ< E > Ġcontin ually ( generator : Ġ() Ġ-> ĠE ): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġcons ( generator . invoke ()) Ġ{ Ġcontin ually ( generator ) Ġ} Ċ } Ċ Ċ fun Ġ< E > Ġcontin ually ( cycle : ĠIterable < E >): ĠPer mutation < E > Ġ{ ĊĠ Ġreturn Ġif Ġ(! cycle . iterator (). hasNext ()) Ġ{ ĊĠĠĠ Ġempty Per mutation () ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġcontin ually Unsafe ( cycle ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< E > Ġcontin ually Unsafe ( cycle : ĠIterable < E >): ĠPer mutation < E > Ġ= Ġconcat ( cycle ) Ġ{ Ġcontin ually ( cycle ) Ġ} Ċ fun Ġ< E > Ġcontin ually ( value : ĠE ): ĠPer mutation < E > Ġ= Ġcons ( value ) Ġ{ Ġcontin ually ( value ) Ġ} Ċ Ċ @ Jvm Over loads Ċ fun Ġnumbers ( start : ĠInt , Ġstep : ĠInt Ġ= Ġ 1 ): ĠPer mutation < Int > ĊĠĠĠ Ġ= Ġcons ( start ) Ġ{ Ġnumbers ( start Ġ+ Ġstep , Ġstep ) Ġ} Ċ Ċ @ Jvm Over loads Ċ fun Ġnumbers ( start : ĠLong , Ġstep : ĠLong Ġ= Ġ 1 L ): ĠPer mutation < Long > ĊĠĠĠ Ġ= Ġcons ( start ) Ġ{ Ġnumbers ( start Ġ+ Ġstep , Ġstep ) Ġ} Ċ Ċ @ Jvm Over loads Ċ fun Ġnumbers ( start : ĠFloat , Ġstep : ĠFloat Ġ= Ġ 1 . 0 F ): ĠPer mutation < Float > ĊĠĠĠ Ġ= Ġcons ( start ) Ġ{ Ġnumbers ( start Ġ+ Ġstep , Ġstep ) Ġ} Ċ Ċ @ Jvm Over loads Ċ fun Ġnumbers ( start : ĠDouble , Ġstep : ĠDouble Ġ= Ġ 1 . 0 ): ĠPer mutation < Double > ĊĠĠĠ Ġ= Ġcons ( start ) Ġ{ Ġnumbers ( start Ġ+ Ġstep , Ġstep ) Ġ} Ċ