package Ġcom . github . ler ne jo . k ore k to . toolkit Ċ Ċ import Ġcom . github . ler ne jo . k ore k to . toolkit . misc . Throw ing Consumer Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Consumer Ċ Ċ interface ĠN ature < CONTEXT Ġ: ĠN ature Context > Ġ{ ĊĠĠĠ Ġfun Ġ< RESULT > Ġwith Context ( action : Ġ( CONTEXT ) Ġ-> ĠRESULT ): ĠRESULT ĊĊĠĠĠ Ġ@ Jvm Name (" in Context K ") ĊĠĠĠ Ġprivate Ġfun Ġin Context ( action : Ġ( CONTEXT ) Ġ-> ĠUnit ) Ġ= Ġwith Context < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġaction ( it ) ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Context ( action : ĠThrow ing Consumer < CONTEXT >) Ġ= Ġwith Context Ġ{ Ġc Ġ-> Ġaction . accept ( c ) Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠN ature Context Ċ Ċ interface ĠN ature Factory Ġ{ ĊĠĠĠ Ġfun Ġget N ature ( exercise : ĠExercise ): ĠOptional < N ature <* >> ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlookup N atures ( exercise : ĠExercise ): ĠMap < Class < out ĠN ature <* >>, ĠN ature <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Loader Ġ= ĠService Loader . load ( N ature Factory :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġservice Loader . map Ġ{ Ġit . getN ature ( exercise ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isPresent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . get () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġp Ġ-> ĠPair ( p . java Class , Ġp ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ