package Ġsilent orb . imp . core Ċ Ċ tail rec Ġfun Ġget Root Type ( context : ĠContext , Ġtype : ĠType Hash ): ĠType Hash Ġ{ ĊĠ Ġval Ġalias Ġ= ĠgetType Alias ( context , Ġtype ) ĊĠ Ġreturn Ġif Ġ( alias Ġ== Ġnull ) ĊĠĠĠ Ġtype ĊĠ Ġelse ĊĠĠĠ Ġget Root Type ( context , Ġalias ) Ċ } Ċ Ċ fun Ġtype Can Be Cast To ( context : ĠContext , Ġsource : ĠType Hash , Ġtarget : ĠType Hash ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġget Root Type ( context , Ġsource ) Ġ== Ġget Root Type ( context , Ġtarget ) Ċ } Ċ Ċ fun Ġmatch Vari adic Function ( context : ĠContext , Ġarguments : ĠList < Argument >, Ġfunction Key : ĠPath Key , Ġsignature : ĠSignature ): ĠSignature Match ? Ġ{ ĊĠ Ġval Ġparameter Type Ġ= Ġsignature . parameters . first (). type ĊĠ Ġreturn Ġif Ġ( arguments . all Ġ{ Ġargument Ġ-> Ġtype Can Be Cast To ( context , Ġargument . type , Ġparameter Type ) Ġ}) Ġ{ ĊĠĠĠ Ġval Ġalignment Ġ= Ġarguments ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex , Ġargument Ġ-> Ġindex . toString () Ġto Ġargument . node Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit Ġ} ĊĊĠĠĠ ĠSignature Match ( ĊĠĠĠĠĠĠĠ Ġkey Ġ= Ġfunction Key , ĊĠĠĠĠĠĠĠ Ġsignature Ġ= Ġsignature , ĊĠĠĠĠĠĠĠ Ġalignment Ġ= Ġalignment , ĊĠĠĠĠĠĠĠ Ġcomplete Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĠ Ġ} Ġelse ĊĠĠĠ Ġnull Ċ } Ċ Ċ fun Ġoverload Matches ( context : ĠContext , Ġarguments : ĠList < Argument >, Ġover loads : ĠMap < Path Key , ĠSignature >): ĠList < Signature Match > Ġ{ ĊĠ Ġval Ġarguments ByType Ġ= Ġarguments . groupBy Ġ{ Ġit . type Ġ} ĊĠ Ġval Ġmatches Ġ= Ġover loads ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġ( function Key , Ġsignature ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( signature . is Vari adic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmatch Vari adic Function ( context , Ġarguments , Ġfunction Key , Ġsignature ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġnamed Arguments Ġ= Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġargument Ġ-> Ġargument . name Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġsignature . parameters . first OrNull Ġ{ Ġit . name Ġ== Ġargument . name !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter Ġ!= Ġnull Ġ&& Ġtype Can Be Cast To ( context , Ġargument . type , Ġparameter . type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( parameter . name , Ġargument . node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġindexed Arguments Ġ= Ġarguments ByType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( argument Type , Ġtype Arguments ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġsignature . parameters . filter Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Can Be Cast To ( context , Ġargument Type , Ġparameter . type ) Ġ&& Ġnamed Arguments . none Ġ{ Ġit . first Ġ== Ġparameter . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters . size Ġ== Ġtype Arguments . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . zip ( parameters ) Ġ{ Ġa , Ġb Ġ-> ĠPair ( b . name , Ġa . node ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġalignment Ġ= Ġnamed Arguments . plus ( indexed Arguments ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( alignment . size Ġ< Ġarguments . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature Match ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġfunction Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ= Ġsignature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Ġ= Ġalignment . associate Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplete Ġ= Ġsignature . parameters . size Ġ== Ġarguments . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġif Ġ( matches . none ()) Ġ{ ĊĠĠĠ Ġval Ġk Ġ= Ġ 0 ĊĠ Ġ} ĊĠ Ġreturn Ġmatches Ċ } Ċ