package Ġorg . open rnd r . shape Ċ Ċ import Ġorg . open rnd r . color . Color RGB a Ċ import Ġorg . open rnd r . draw . Color Buffer Ċ import Ġorg . open rnd r . draw . Shade Style Ċ import Ġorg . open rnd r . math . Matrix 4 4 Ċ import Ġkotlin . reflect . K Mutable Property 0 Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠDescri bes Ġa Ġnode Ġin Ġa Ġcomposition Ċ Ġ*/ Ċ sealed Ġclass ĠComp osition Node Ġ{ ĊĠĠĠ Ġvar Ġid : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġparent : ĠComp osition Node ? Ġ= Ġnull ĊĠĠĠ Ġopen Ġvar Ġtransform Ġ= ĠMatrix 4 4 . IDENTITY ĊĠĠĠ Ġvar Ġfill : ĠComp osition Color Ġ= ĠInherit Color ĊĠĠĠ Ġvar Ġstroke : ĠComp osition Color Ġ= ĠInherit Color ĊĠĠĠ Ġvar Ġstroke Weight : ĠComp osition Stroke Weight Ġ= ĠInherit Stroke Weight ĊĠĠĠ Ġvar Ġattributes Ġ= Ġmutable Map Of < String , ĠString ?> () ĊĠĠĠ Ġvar Ġsh ade Style : ĠComp osition Shade Style Ġ= ĠInherit Shade Style ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġmap Ġthat Ġstores Ġuser Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠuserData Ġ= Ġmutable Map Of < String , ĠAny >() ĊĊĠĠĠ Ġopen Ġval Ġbounds : ĠRectangle ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠTODO (" can 't Ġhave Ġit ") ĊĊĊĠĠĠ Ġval Ġeffective Shade Style : ĠSh ade Style ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsh ade Style . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInherit Shade Style Ġ-> Ġparent ?. effective Shade Style ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC Shade Style Ġ-> Ġit . shade Style ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġeffective Stroke : ĠColor RGB a ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstroke . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInherit Color Ġ-> Ġparent ?. effective Stroke ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠColor Ġ-> Ġit . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġeffective Fill : ĠColor RGB a ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfill . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInherit Color Ġ-> Ġparent ?. effective Fill Ġ?: ĠColor RGB a . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠColor Ġ-> Ġit . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġeffective Transform : ĠMatrix 4 4 ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( transform Ġ=== ĠMatrix 4 4 . IDENTITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. effective Transform Ġ?: ĠMatrix 4 4 . IDENTITY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ* Ġ( parent ?. effective Transform Ġ?: ĠMatrix 4 4 . IDENTITY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ infix Ġfun ĠK Mutable Property 0 < Composition Shade Style >. ` =` ( shade Style : ĠSh ade Style ?) Ġ= Ġthis . set ( C Shade Style ( shade Style )) Ċ infix Ġfun ĠK Mutable Property 0 < Composition Color >. ` =` ( color : ĠColor RGB a ?) Ġ= Ġthis . set ( Color ( color )) Ċ infix Ġfun ĠK Mutable Property 0 < Composition Stroke Weight >. ` =` ( weight : ĠDouble ) Ġ= Ġthis . set ( Stroke Weight ( weight )) Ċ Ċ operator Ġfun ĠK Mutable Property 0 < Composition Shade Style >. setValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠSh ade Style ) Ġ{ ĊĠĠĠ Ġthis . set ( C Shade Style ( value )) Ċ } Ċ Ċ sealed Ġclass ĠComp osition Color Ċ object ĠInherit Color Ġ: ĠComp osition Color () Ċ data Ġclass ĠColor ( val Ġcolor : ĠColor RGB a ?) Ġ: ĠComp osition Color () Ċ Ċ sealed Ġclass ĠComp osition Shade Style Ċ object ĠInherit Shade Style Ġ: ĠComp osition Shade Style () Ċ data Ġclass ĠC Shade Style ( val Ġsh ade Style : ĠSh ade Style ?) Ġ: ĠComp osition Shade Style () Ċ Ċ sealed Ġclass ĠComp osition Stroke Weight Ċ object ĠInherit Stroke Weight Ġ: ĠComp osition Stroke Weight () Ċ data Ġclass ĠSt roke Weight ( val Ġweight : ĠDouble ) Ġ: ĠComp osition Stroke Weight () ĊĊ Ċ private Ġfun Ġtransform ( node : ĠComp osition Node ): ĠMatrix 4 4 Ġ= ĊĠĠĠĠĠĠĠ Ġ( node . parent ?. let Ġ{ Ġtransform ( it ) Ġ} Ġ?: ĠMatrix 4 4 . IDENTITY ) Ġ* Ġnode . transform Ċ Ċ class ĠImage Node ( var Ġimage : ĠColor Buffer , Ġvar Ġx : ĠDouble , Ġvar Ġy : ĠDouble , Ġvar Ġwidth : ĠDouble , Ġvar Ġheight : ĠDouble ) Ġ: ĠComp osition Node () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġbounds : ĠRectangle ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠRectangle ( 0 . 0 , Ġ 0 . 0 , Ġwidth , Ġheight ). contour . transform ( transform ( this )). bounds Ċ } Ċ Ċ class ĠShape Node ( var Ġshape : ĠShape ) Ġ: ĠComp osition Node () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġbounds : ĠRectangle ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġeffective Transform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( t Ġ=== ĠMatrix 4 4 . IDENTITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape . bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape . bounds . contour . transform ( t ). bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġtransforms Ġof Ġall Ġancestor Ġnodes Ġand Ġreturns Ġa Ġnew Ġdet ached ĠShape Node Ġwith Ġcon fl ated Ġtransform ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconf late (): ĠShape Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠShape Node ( shape ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fill Ġ= Ġfill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stroke Ġ= Ġstroke ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . transform Ġ= Ġtransform ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġtransforms Ġof Ġall Ġancestor Ġnodes Ġand Ġreturns Ġa Ġnew Ġdet ached Ġshape Ġnode Ġwith Ġidentity Ġtransform Ġand Ġtransformed ĠShape ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflatten (): ĠShape Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠShape Node ( shape . transform ( transform ( this ))). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fill Ġ= Ġfill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stroke Ġ= Ġstroke ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . transform Ġ= ĠMatrix 4 4 . IDENTITY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy ( id : ĠString ? Ġ= Ġthis . id , Ġparent : ĠComp osition Node ? Ġ= Ġnull , Ġtransform : ĠMatrix 4 4 Ġ= Ġthis . transform , Ġfill : ĠComp osition Color Ġ= Ġthis . fill , Ġstroke : ĠComp osition Color Ġ= Ġthis . stroke , Ġshape : ĠShape Ġ= Ġthis . shape ): ĠShape Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠShape Node ( shape ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . transform Ġ= Ġtransform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fill Ġ= Ġfill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stroke Ġ= Ġstroke ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . shape Ġ= Ġshape ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠShape Node ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( shape Ġ!= Ġother . shape ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshape . hashCode () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġeffective Shape ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġshape . transform ( effective Transform ) Ċ Ċ } Ċ Ċ data Ġclass ĠText Node ( var Ġtext : ĠString , Ġvar Ġcontour : ĠShape Contour ?) Ġ: ĠComp osition Node () Ċ Ċ open Ġclass ĠGroup Node ( val Ġchildren : ĠMutable List < Composition Node > Ġ= Ġmutable ListOf ()) Ġ: ĠComp osition Node () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġbounds : ĠRectangle ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġrectangle Bounds ( children . map Ġ{ Ġit . bounds Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy ( id : ĠString ? Ġ= Ġthis . id , Ġparent : ĠComp osition Node ? Ġ= Ġnull , Ġtransform : ĠMatrix 4 4 Ġ= Ġthis . transform , Ġfill : ĠComp osition Color Ġ= Ġthis . fill , Ġstroke : ĠComp osition Color Ġ= Ġthis . stroke , Ġchildren : ĠMutable List < Composition Node > Ġ= Ġthis . children ): ĠGroup Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGroup Node ( children ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . transform Ġ= Ġtransform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fill Ġ= Ġfill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stroke Ġ= Ġstroke ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠGroup Node ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( children Ġ!= Ġother . children ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchildren . hashCode () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ val ĠDefault Composition Bounds Ġ= ĠRectangle ( 0 . 0 , Ġ 0 . 0 , Ġ 2 6 7 6 . 0 , Ġ 2 0 4 8 . 0 ) Ċ Ċ class ĠGroup Node Stop ( children : ĠMutable List < Composition Node >) Ġ: ĠGroup Node ( children ) Ċ class ĠComp osition ( val Ġroot : ĠComp osition Node , Ġvar Ġdocument Bounds : ĠRectangle Ġ= ĠDefault Composition Bounds ) Ġ{ ĊĠĠĠ Ġval Ġnamespaces Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠ Ġfun Ġfind Shapes () Ġ= Ġroot . find Shapes () ĊĠĠĠ Ġfun Ġfind Shape ( id : ĠString ): ĠShape Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( root . find Terminal s Ġ{ Ġit Ġis ĠShape Node Ġ&& Ġit . id Ġ== Ġid Ġ}). first OrNull () Ġas ? ĠShape Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Images () Ġ= Ġroot . find Images () ĊĠĠĠ Ġfun Ġfind Image ( id : ĠString ): ĠImage Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( root . find Terminal s Ġ{ Ġit Ġis ĠImage Node Ġ&& Ġit . id Ġ== Ġid Ġ}). first OrNull () Ġas ? ĠImage Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Groups (): ĠList < Group Node > Ġ= Ġroot . find Groups () ĊĠĠĠ Ġfun Ġfind Group ( id : ĠString ): ĠGroup Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( root . find Terminal s Ġ{ Ġit Ġis ĠGroup Node Ġ&& Ġit . id Ġ== Ġid Ġ}). first OrNull () Ġas ? ĠGroup Node ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠComp osition Node . remove () Ġ{ ĊĠĠĠ Ġrequire ( parent Ġ!= Ġnull ) Ġ{ Ġ" parent Ġis Ġnull " Ġ} ĊĠĠĠ Ġ( parent Ġas ? ĠGroup Node )?. children ?. remove ( this ) ĊĠĠĠ Ġparent Ġ= Ġnull Ċ } Ċ Ċ fun ĠComp osition Node . find Terminal s ( filter : Ġ( Composition Node ) Ġ-> ĠBoolean ): ĠList < Composition Node > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Composition Node >() ĊĠĠĠ Ġfun Ġfind ( node : ĠComp osition Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGroup Node Ġ-> Ġnode . children . forEach Ġ{ Ġfind ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( filter ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfind ( this ) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠComp osition Node . findAll ( filter : Ġ( Composition Node ) Ġ-> ĠBoolean ): ĠList < Composition Node > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Composition Node >() ĊĠĠĠ Ġfun Ġfind ( node : ĠComp osition Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠGroup Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . children . forEach Ġ{ Ġfind ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfind ( this ) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠComp osition Node . find Shapes (): ĠList < Shape Node > Ġ= Ġfind Terminal s Ġ{ Ġit Ġis ĠShape Node Ġ}. map Ġ{ Ġit Ġas ĠShape Node Ġ} Ċ fun ĠComp osition Node . find Images (): ĠList < Image Node > Ġ= Ġfind Terminal s Ġ{ Ġit Ġis ĠImage Node Ġ}. map Ġ{ Ġit Ġas ĠImage Node Ġ} Ċ fun ĠComp osition Node . find Groups (): ĠList < Group Node > Ġ= ĠfindAll Ġ{ Ġit Ġis ĠGroup Node Ġ}. map Ġ{ Ġit Ġas ĠGroup Node Ġ} Ċ Ċ fun ĠComp osition Node . visit All ( visitor : Ġ( Composition Node . () Ġ-> ĠUnit )) Ġ{ ĊĠĠĠ Ġvisitor () ĊĠĠĠ Ġif Ġ( this Ġis ĠGroup Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . visit All ( visitor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠUser Data Ġdelegate Ċ Ġ*/ Ċ class ĠUser Data < T Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , Ġval Ġinitial : ĠT Ċ ) Ġ{ ĊĠĠĠ Ġ@ Suppress (" USE LESS _ CAST ", Ġ" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoperator Ġfun ĠgetValue ( node : ĠComp osition Node , Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠT ? Ġ= Ġnode . userData [ name ] Ġas ? ĠT ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ?: Ġinitial ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( stylesheet : ĠComp osition Node , Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstylesheet . userData [ name ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Deprecated (" comp licated Ġsemantics ") Ċ fun ĠComp osition Node . filter ( filter : Ġ( Composition Node ) Ġ-> ĠBoolean ): ĠComp osition Node ? Ġ{ ĊĠĠĠ Ġval Ġf Ġ= Ġfilter ( this ) ĊĊĠĠĠ Ġif Ġ(! f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠGroup Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopies Ġ= Ġmutable ListOf < Composition Node >() ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġit . filter ( filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filtered Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( filtered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShape Node Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies . add ( filtered . copy ( parent Ġ= Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGroup Node Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies . add ( filtered . copy ( parent Ġ= Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGroup Node ( children Ġ= Ġcopies ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Deprecated (" comp licated Ġsemantics ") Ċ fun ĠComp osition Node . map ( mapper : Ġ( Composition Node ) Ġ-> ĠComp osition Node ): ĠComp osition Node Ġ{ ĊĠĠĠ Ġval Ġr Ġ= Ġmapper ( this ) ĊĠĠĠ Ġreturn Ġwhen Ġ( r ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠGroup Node Stop Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . copy (). also Ġ{ Ġcopy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠGroup Node Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġr . copy ( children Ġ= Ġr . children . map Ġ{ Ġit . map ( mapper ) Ġ}. to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġr ĊĠĠĠ Ġ} Ċ } ĊĊ