package Ġio . fluid sonic . rap tor ĊĊ Ċ interface ĠR apt or Property Set Ġ{ ĊĊ ĉ operator Ġfun Ġ< Value Ġ: ĠAny > Ġget ( key : ĠR apt or Property Key < out ĠValue >): ĠValue ? Ċ ĉ fun ĠisEmpty (): ĠBoolean Ċ ĉ override Ġfun ĠtoString (): ĠString ĊĊĊ ĉ comp anion Ġobject Ġ{ ĊĊĉ ĉ fun Ġempty (): ĠR apt or Property Set Ġ= Ċĉĉ ĉ Empty R apt or Property Set Ċ ĉ } Ċ } ĊĊ Ċ private Ġobject ĠEmpty R apt or Property Set Ġ: ĠR apt or Property Set Ġ{ ĊĊ ĉ override Ġfun Ġ< Value Ġ: ĠAny > Ġget ( key : ĠR apt or Property Key < out ĠValue >): ĠNothing ? Ġ= Ġnull ĊĊĊ ĉ override Ġfun ĠisEmpty () Ġ= Ċĉ ĉ true ĊĊĊ ĉ override Ġfun ĠtoString () Ġ= Ċĉ ĉ "[ property Ġset ] Ġ-> Ġ( empty )" Ċ } ĊĊ Ċ private Ġclass ĠF allback R apt or Property Set ( Ċ ĉ private Ġval Ġset : ĠR apt or Property Set , Ċ ĉ private Ġval Ġfallback : ĠR apt or Property Set Ċ ) Ġ: ĠR apt or Property Set Ġ{ ĊĊ ĉ override Ġfun Ġ< Value Ġ: ĠAny > Ġget ( key : ĠR apt or Property Key < out ĠValue >): ĠValue ? Ġ= Ċĉ ĉ set [ key ] Ġ?: Ġfallback [ key ] ĊĊĊ ĉ override Ġfun ĠisEmpty () Ġ= Ċĉ ĉ set . isEmpty () Ġ&& Ġfallback . isEmpty () ĊĊĊ ĉ override Ġfun ĠtoString () Ġ= Ċĉ ĉ set . toString () Ġ// ĠFIXME Ġadd Ġfallback Ċ } ĊĊ Ċ fun ĠR apt or Property Set . with Fallback ( fallback : ĠR apt or Property Set ): ĠR apt or Property Set Ġ{ Ċ ĉ check ( fallback Ġ!== Ġthis ) Ġ{ Ġ" A Ġproperty Ġset Ġcannot Ġfall Ġback Ġto Ġitself ." Ġ} ĊĊ ĉ return Ġwhen Ġ{ Ċĉ ĉ this Ġ=== ĠEmpty R apt or Property Set Ġ-> Ġfallback Ċĉ ĉ fallback Ġ=== ĠEmpty R apt or Property Set Ġ-> Ġthis Ċĉ ĉ else Ġ-> ĠF allback R apt or Property Set ( set Ġ= Ġthis , Ġfallback Ġ= Ġfallback ) Ċ ĉ } Ċ Ċ } Ċ