package Ġmax Ċ Ċ interface ĠRouter < T Ġ: ĠRouter . Request > Ġ{ ĊĊĠĠĠ Ġfun Ġhandle ( route : ĠUri ): ĠBoolean ĊĊĠĠĠ Ġfun Ġrouter For ( route : ĠUri ): ĠRouter < T >? ĊĊĠĠĠ Ġfun Ġmatch ( route : ĠUri ): ĠMap < String , ĠAny > ĊĊĠĠĠ Ġfun Ġmatches ( route : ĠUri ): ĠBoolean ĊĊĠĠĠ Ġinterface ĠHandler < in ĠT Ġ: ĠRequest > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġhandle ( request : ĠT ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠRequest Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġroute : ĠUri ĊĠĠĠĠĠĠĠ Ġval Ġparams : ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġval Ġspl at : ĠList < String > ĊĊĠĠĠĠĠĠĠ Ġinterface ĠCreator < T Ġ: ĠRequest > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate ( route : ĠUri , Ġparams : ĠMap < String , ĠString >, Ġspl at : ĠList < String >): ĠT ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġdefault (): ĠCreator < Default > Ġ= Ġobject Ġ: ĠCreator < Default > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( route : ĠUri , Ġparams : ĠMap < String , ĠString >, Ġspl at : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault ( route , Ġparams , Ġspl at ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠDefault ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġroute : ĠUri , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġparams : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġspl at : ĠList < String > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠRequest ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠBuilder < T Ġ: ĠRequest > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġpath ( path : ĠString , Ġinit : ĠBuilder < T >. () Ġ-> ĠUnit ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġroute ( path : ĠString , Ġhandler : ĠHandler < T >) ĊĊĠĠĠĠĠĠĠ Ġfun Ġroute ( path : ĠString , Ġhandler : Ġ( T ) Ġ-> ĠUnit ) Ġ= Ġroute ( path , Ġobject Ġ: ĠHandler < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle ( request : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠImp l < T Ġ: ĠRequest >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmatcher : ĠMatcher , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler < T > ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcreator : ĠRequest . Creator < T > ĊĠĠĠ Ġ) Ġ: ĠRouter < T >, ĠBuilder < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchildren Ġ= Ġmutable ListOf < Impl < T >>() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle ( route : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġrouter For ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( router ?. handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġrouter . match ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreator . create ( route , ĠMatcher . params ( params ), ĠMatcher . sp lat ( params )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . handler . handle ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrouter For ( route : ĠUri ): ĠImp l < T >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġchild . router For ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( router Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrouter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches ( route )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatch ( route : ĠUri ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatcher . match ( route . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( route : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatcher . matches ( route . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpath ( path : ĠString , Ġinit : ĠBuilder < T >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= ĠImp l ( matcher . append ( path ), Ġnull , Ġcreator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child ( router ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġroute ( path : ĠString , Ġhandler : ĠHandler < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= ĠImp l ( matcher . append ( path ), Ġhandler , Ġcreator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child ( router ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Child ( router : ĠImp l < T >): ĠImp l < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( router ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSPL AT Ġ= ĠMatcher . SP LAT ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( init : ĠBuilder < out ĠRequest >. () Ġ-> ĠUnit ): ĠRouter < out ĠRequest > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( init , ĠRequest . Creator . default ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġ< T Ġ: ĠRequest > Ġinvoke ( init : ĠBuilder < T >. () Ġ-> ĠUnit , Ġcreator : ĠRequest . Creator < T >): ĠRouter < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= ĠImp l ( Matcher . empty (), Ġnull , Ġcreator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrouter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } ĊĊ