package Ġio . pol ymorphic p anda . k spec . tag Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ author ĠR anie ĠJ ade ĠRam iso Ċ Ġ*/ Ċ abstract Ġclass ĠTag gable ( tags : ĠSet < Tag <* >>) Ġ{ ĊĠĠĠ Ġabstract Ġval Ġparent : ĠTag gable ? ĊĊĠĠĠ Ġval Ġtags : ĠMap < K Class <* >, ĠTag <* >> Ġ= Ġtags . groupBy Ġ{ ĊĠĠĠĠĠĠĠ Ġit . java Class . kotlin Ġas ĠK Class < *> ĊĠĠĠ Ġ}. map Values Ġ{ Ġit . value . first () Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠK Class < out ĠTag <* >>> Ġcontains ( tags : ĠCollection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . tags . any Ġ{ Ġtags . contains ( it . key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparent ?. contains ( tags ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠK Class < out ĠTag <* >>> Ġcontains All ( tags : ĠCollection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( this . tags . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġthis . tags . all Ġ{ Ġtags . contains ( it . key ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġparent ?. contains All ( tags ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠK Class < out ĠTag <* >>> Ġcontains ( var arg Ġtags : ĠT ) Ġ= Ġcontains ( set Of (* tags )) ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT : ĠTag <* >> Ġget (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tags . containsKey ( T :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtags [ T :: class ] Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( parent Ġ!= Ġnull Ġ&& Ġparent !!. tags . containsKey ( T :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent !!. tags [ T :: class ] Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ