package Ġcom . sk sam uel . hop lite Ċ Ċ interface ĠNode Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġpositional Ġinformation Ġof Ġthis Ġvalue . ĊĠĠ Ġ*/ ĊĠ Ġval Ġpos : ĠPos ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġ[ Primitive Node ] Ġat Ġthe Ġgiven Ġkey . ĊĠĠ Ġ* ĠIf Ġthis Ġnode Ġis Ġnot Ġa Ġ[ Map Node ] Ġor Ġthe Ġnode Ġcontained Ġat Ġthe ĊĠĠ Ġ* Ġgiven Ġkey Ġis Ġnot Ġa Ġprimitive , Ġor Ġthe Ġnode Ġdoes Ġnot Ġcontain ĊĠĠ Ġ* Ġthe Ġkey Ġat Ġall , Ġthen Ġthis Ġwill Ġreturn Ġ[ Undefined ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġat Key ( key : ĠString ): ĠNode ĊĊĠ Ġoperator Ġfun Ġget ( key : ĠString ): ĠNode Ġ= Ġat Key ( key ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġ[ Node ] Ġstored Ġat Ġthe Ġgiven Ġindex Ġof Ġthis Ġnode . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturns Ġ[ Undefined ] Ġif Ġthis Ġnode Ġdoes Ġnot Ġcontain Ġan ĊĠĠ Ġ* Ġelement Ġat Ġthe Ġgiven Ġindex , Ġor Ġis Ġnot Ġan Ġ[ Array Node ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġat Index ( index : ĠInt ): ĠNode ĊĊĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠNode Ġ= Ġat Index ( index ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġ[ Node ] Ġat Ġthe Ġgiven Ġpath , Ġby Ġrecurs ivel Ġcalling Ġ[ at Key ] ĊĠĠ Ġ* Ġfor Ġeach Ġdot Ġseper ated Ġelement Ġin Ġthe Ġinput Ġpath . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġat Path ( path : ĠString ): ĠNode Ġ{ ĊĠĠĠ Ġval Ġparts Ġ= Ġpath . split ('.') ĊĠĠĠ Ġreturn Ġparts . fold ( this ) Ġ{ Ġacc , Ġpart Ġ-> Ġacc . at Key ( part ) Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġsimple Name : ĠString ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġhe Ġnumber Ġof Ġchild Ġnodes Ġthis Ġnode Ġcontains . ĠThat Ġis , Ġfor Ġ[ Array Node ] Ġit Ġis ĊĠĠ Ġ* Ġthe Ġnumber Ġof Ġchild Ġnodes ; Ġfor Ġ[ Map Node ] Ġit Ġis Ġthe Ġnumber Ġof Ġfields , Ġand Ġfor Ġall ĊĠĠ Ġ* Ġother Ġnodes Ġit Ġis Ġ 0 . ĊĠĠ Ġ*/ ĊĠ Ġval Ġsize : ĠInt Ċ } Ċ Ċ val ĠNode . isDefined : ĠBoolean ĊĠ Ġget () Ġ= Ġthis Ġ! is ĠUndefined Ċ Ċ fun ĠNode . has Key At ( key : ĠString ): ĠBoolean Ġ= Ġat Key ( key ). isDefined Ċ Ċ /** Ċ Ġ* ĠApplies Ġthe Ġgiven Ġfunction Ġto Ġall Ġstring Ġvalues , Ġrecursively Ġcalling Ġinto Ġlists Ġand Ġmaps . Ċ Ġ*/ Ċ fun ĠNode . transform ( f : Ġ( String ) Ġ-> ĠString ): ĠNode Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠ Ġis ĠString Node Ġ-> Ġthis . copy ( value Ġ= Ġf ( this . value )) ĊĠ Ġis ĠMap Node Ġ-> ĠMap Node ( map . map Ġ{ Ġf ( it . key ) Ġto Ġit . value . transform ( f ) Ġ}. toMap (), Ġpos , Ġthis . value ) ĊĠ Ġis ĠArray Node Ġ-> ĠArray Node ( elements . map Ġ{ Ġit . transform ( f ) Ġ}, Ġpos ) ĊĠ Ġelse Ġ-> Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠApplies Ġthe Ġgiven Ġfunction Ġto Ġall Ġkey Ġnames , Ġrecursively Ġcalling Ġinto Ġlists Ġand Ġmaps . Ċ Ġ*/ Ċ fun ĠNode . map Key ( f : Ġ( String ) Ġ-> ĠString ): ĠNode Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠ Ġis ĠMap Node Ġ-> Ġthis . copy ( map Ġ= Ġthis . map . map Ġ{ Ġf ( it . key ) Ġto Ġit . value . map Key ( f ) Ġ}. toMap ()) ĊĠ Ġelse Ġ-> Ġthis Ċ } Ċ Ċ sealed Ġclass ĠContainer Node Ġ: ĠNode Ċ Ċ data Ġclass ĠMap Node ( val Ġmap : ĠMap < String , ĠNode >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpos : ĠPos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠNode Ġ= ĠUndefined ) Ġ: ĠContainer Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" Map " ĊĠ Ġoverride Ġfun Ġat Key ( key : ĠString ): ĠNode Ġ= Ġmap [ key ] Ġ?: ĠUndefined ĊĠ Ġoverride Ġfun Ġat Index ( index : ĠInt ): ĠNode Ġ= ĠUndefined ĊĠ Ġoverride Ġval Ġsize : ĠInt Ġ= Ġmap . size Ċ } Ċ Ċ data Ġclass ĠArray Node ( val Ġelements : ĠList < Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpos : ĠPos ) Ġ: ĠContainer Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" List " ĊĠ Ġoverride Ġfun Ġat Key ( key : ĠString ): ĠNode Ġ= ĠUndefined ĊĠ Ġoverride Ġfun Ġat Index ( index : ĠInt ): ĠNode Ġ= Ġelements . getOrElse ( index ) Ġ{ ĠUndefined Ġ} ĊĠ Ġoverride Ġval Ġsize : ĠInt Ġ= Ġelements . size Ċ } Ċ Ċ sealed Ġclass ĠPrimitive Node Ġ: ĠNode Ġ{ ĊĠ Ġoverride Ġfun Ġat Key ( key : ĠString ): ĠNode Ġ= ĠUndefined ĊĠ Ġoverride Ġfun Ġat Index ( index : ĠInt ): ĠNode Ġ= ĠUndefined ĊĠ Ġoverride Ġval Ġsize : ĠInt Ġ= Ġ 0 ĊĠ Ġabstract Ġval Ġvalue : ĠAny ? Ċ } Ċ Ċ data Ġclass ĠString Node ( override Ġval Ġvalue : ĠString , Ġoverride Ġval Ġpos : ĠPos ) Ġ: ĠPrimitive Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" String " Ċ } Ċ Ċ data Ġclass ĠBoolean Node ( override Ġval Ġvalue : ĠBoolean , Ġoverride Ġval Ġpos : ĠPos ) Ġ: ĠPrimitive Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" Boolean " Ċ } Ċ Ċ sealed Ġclass ĠNumber Node Ġ: ĠPrimitive Node () Ċ Ċ data Ġclass ĠLong Node ( override Ġval Ġvalue : ĠLong , Ġoverride Ġval Ġpos : ĠPos ) Ġ: ĠNumber Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" Long " Ċ } Ċ Ċ data Ġclass ĠDouble Node ( override Ġval Ġvalue : ĠDouble , Ġoverride Ġval Ġpos : ĠPos ) Ġ: ĠNumber Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" Double " Ċ } Ċ Ċ data Ġclass ĠNull Node ( override Ġval Ġpos : ĠPos ) Ġ: ĠPrimitive Node () Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" null " ĊĠ Ġoverride Ġval Ġvalue : ĠAny ? Ġ= Ġnull Ċ } Ċ Ċ object ĠUndefined Ġ: ĠNode Ġ{ ĊĠ Ġoverride Ġval Ġsimple Name : ĠString Ġ= Ġ" Undefined " ĊĠ Ġoverride Ġval Ġpos : ĠPos Ġ= ĠPos . No Pos ĊĠ Ġoverride Ġfun Ġat Key ( key : ĠString ): ĠNode Ġ= Ġthis ĊĠ Ġoverride Ġfun Ġat Index ( index : ĠInt ): ĠNode Ġ= Ġthis ĊĠ Ġoverride Ġval Ġsize : ĠInt Ġ= Ġ 0 Ċ } Ċ