package Ġorg . b aby fish . kim mer . meta Ċ Ċ import Ġorg . b aby fish . kim mer . Async Draft Ċ import Ġorg . b aby fish . kim mer . Draft Ċ import Ġorg . b aby fish . kim mer . Immutable Ċ import Ġorg . b aby fish . kim mer . Sync Draft Ċ import Ġorg . b aby fish . kim mer . graphql . Connection Ċ import Ġorg . b aby fish . kim mer . runtime . Immutable Spi Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ import Ġkotlin . reflect . K Class Ċ Ċ interface ĠImmutable Type Ġ{ ĊĊĠĠĠ Ġval Ġkotlin Type : ĠK Class < out ĠImmutable > ĊĊĠĠĠ Ġval Ġsimple Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġkotlin Type . simple Name !! ĊĊĠĠĠ Ġval Ġqualified Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġkotlin Type . qualified Name !! ĊĊĠĠĠ Ġval Ġis Abstract : ĠBoolean ĊĊĠĠĠ Ġval Ġsuper Types : ĠSet < Immutable Type > ĊĊĠĠĠ Ġval Ġdeclared Props : ĠMap < String , ĠImmutable Prop > ĊĊĠĠĠ Ġval Ġprops : ĠMap < String , ĠImmutable Prop > ĊĊĠĠĠ Ġval Ġdraft Info : ĠDraft Info ? ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġof ( type : ĠK Class < out ĠImmutable >): ĠImmutable Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Immutable Type ( type . java ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġof ( type : ĠClass < out ĠImmutable >): ĠImmutable Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Immutable Type ( type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Draft Type ( draft Type : ĠK Class < out ĠDraft <* >> ): ĠImmutable Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Draft Type ( draft Type . java ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Draft Type ( draft Type : ĠClass < out ĠDraft <* >> ): ĠImmutable Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Immutable Type By Draft Type ( draft Type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Any Type ( type : ĠK Class < *> ): ĠImmutable Type ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Any Type ( type . java ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Instance ( o : ĠImmutable ): ĠImmutable Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( o Ġas ? ĠImmutable Spi Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" does Ġnot Ġaccept Ġargument Ġwhich Ġimplements Ġ'${ Immutable :: class . qualified Name } '" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" but Ġdoes Ġnot Ġimplement Ġ'${ Immutable Spi :: class . qualified Name } '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). ` { type }` () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Any Object ( o : ĠAny ?): ĠImmutable Type ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( o Ġas ? ĠImmutable Spi )?. ` { type }` () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Any Type ( type : ĠClass < *> ): ĠImmutable Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Immutable :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Connection :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" from Any Type Ġdoes Ġnot Ġaccept Ġconnection Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Connection . Edge :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" from Any Type Ġdoes Ġnot Ġaccept Ġedge Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . is Interface Ġ&& Ġ! Draft :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġof ( type Ġas ĠClass < out ĠImmutable >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper From Class Ġ= Ġtype . super class ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Any Type ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super From Class Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper From Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( itf Ġin Ġtype . interfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper From It f Ġ= Ġfrom Any Type ( itf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super From It f Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper From It f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDraft Info ( ĊĠĠĠ Ġval Ġabstract Type : ĠClass < out ĠDraft <* >>, ĊĠĠĠ Ġval Ġsync Type : ĠClass < out ĠSync Draft <* >> ?, ĊĠĠĠ Ġval Ġasync Type : ĠClass < out ĠAsync Draft <* >> ? Ċ ) Ċ Ċ private Ġval Ġcache Map Ġ= ĠWeak HashMap < Class <* >, ĠType Impl >() Ċ Ċ private Ġval Ġcache Lock Ġ= ĠRe entrant ReadWrite Lock () Ċ Ċ private Ġfun Ġget Immutable Type ( type : ĠClass < out ĠImmutable >): ĠImmutable Type Ġ= ĊĠĠĠ Ġcache Lock . read Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Map [ type ] ĊĠĠĠ Ġ} Ġ?: Ġcache Lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Map [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠParser ( cache Map ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . get ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Map Ġ+= Ġit . terminate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġget Immutable Type By Draft Type ( draft Type : ĠClass < *> ): ĠImmutable Type Ġ= ĊĠĠĠ Ġdraft Cache Lock . read Ġ{ ĊĠĠĠĠĠĠĠ Ġdraft Cache Map [ draft Type ] ĊĠĠĠ Ġ} Ġ?: Ġdraft Cache Lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġdraft Cache Map [ draft Type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcreate Immutable Type By Draft Type ( draft Type )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraft Cache Map [ draft Type ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġcreate Immutable Type By Draft Type ( draft Type : ĠClass < *> ): ĠImmutable Type Ġ{ ĊĠĠĠ Ġval Ġctx Ġ= ĠDraft Scan Context () ĊĠĠĠ Ġctx . accept ( draft Type ) ĊĠĠĠ Ġif Ġ( ctx . immutable Java Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġimmutable Ġinterface Ġis Ġextended Ġby Ġ'${ draft Type . name }' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( ctx . immutable Java Types . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("' ${ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraft Type . name ĊĠĠĠĠĠĠĠ Ġ}' Ġextends Ġconflict Ġimmutable Ġinterfaces : Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . immutable Java Types . join ToString Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġimmutable Type Ġ= Ġget Immutable Type ( ctx . immutable Java Types [ 0 ] Ġas ĠClass < out ĠImmutable >) ĊĠĠĠ Ġif Ġ( immutable Type . draft Info ?. abstract Type Ġ=== Ġdraft Type Ġ|| ĊĠĠĠĠĠĠĠ Ġimmutable Type . draft Info ?. sync Type Ġ=== Ġdraft Type Ġ|| ĊĠĠĠĠĠĠĠ Ġimmutable Type . draft Info ?. async Type Ġ=== Ġdraft Type ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimmutable Type ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠMetadata Exception ( ĊĠĠĠĠĠĠĠ Ġ"' ${ draft Type . name }' Ġextends Ġ'${ immutable Type . kotlin Type . qualified Name }', " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" but Ġ'${ immutable Type . kotlin Type . qualified Name }' Ġdoes Ġnot Ġconsider Ġ'${ draft Type . name }' Ġas Ġits Ġdraft Ġtype " ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġval Ġdraft Cache Map Ġ= ĠWeak HashMap < Class <* >, ĠImmutable Type >() Ċ Ċ private Ġval Ġdraft Cache Lock Ġ= ĠRe entrant ReadWrite Lock () Ċ Ċ private Ġclass ĠDraft Scan Context Ġ{ ĊĊĠĠĠ Ġval Ġimmutable Java Types Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ Ġfun Ġaccept ( type : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Draft :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( super It f Ġin Ġtype . interfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( super It f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Immutable :: class . java . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Immutable :: class . java Ġ!== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Immutable ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( super It f Ġin Ġtype . interfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( super It f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaccept Immutable ( type : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitr Ġ= Ġimmutable Java Types . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Type Ġ= Ġitr . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . isAssignableFrom ( existing Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Type . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitr . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimmutable Java Types . add ( type ) ĊĠĠĠ Ġ} Ċ } ĊĊ