package Ġw ot w . util Ċ Ċ interface ĠBi Map Ġ< K , ĠV >: ĠMap < K , ĠV >{ ĊĠĠĠ Ġoverride Ġval Ġvalues : ĠSet < V > ĊĠĠĠ Ġval Ġinverse : ĠBi Map < V , ĠK > Ċ } Ċ Ċ interface ĠMutable Bi Map Ġ< K , ĠV >: ĠMutable Map < K , ĠV >, ĠBi Map < K , ĠV > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġvalues : ĠMutable Set < V > ĊĠĠĠ Ġoverride Ġval Ġinverse : ĠMutable Bi Map < V , ĠK > Ċ } Ċ Ċ class ĠBi HashMap < K , ĠV > Ġprivate Ġconstructor ( private Ġval Ġmap : ĠMutable Map < K , V >, Ġinverse : ĠBi HashMap < V , ĠK >? Ġ= Ġnull ): ĠMutable Map < K , ĠV > Ġby Ġmap , ĊĠĠĠ ĠMutable Bi Map < K , ĠV > Ġ{ ĊĠĠĠ Ġconstructor (): Ġthis ( HashMap ()) ĊĊĠĠĠ Ġoverride Ġval Ġinverse : ĠMutable Bi Map < V , ĠK > Ġby Ġlazy Ġ{ Ġinverse Ġ?: ĠBi HashMap ( HashMap (), Ġthis ) Ġ} ĊĠĠĠ Ġoverride Ġval Ġvalues Ġget () Ġ= Ġinverse . keys ĊĊĠĠĠ Ġ// Will Ġreplace Ġ( K 1 , ĠV 1 ) Ġand Ġ( K 2 , ĠV 2 ) Ġwith Ġ( K 1 , ĠV 2 ) ĊĠĠĠ Ġoverride Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( get ( key ) Ġ== Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĊĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġmap . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ ĠoldValue ?. let Ġ{ Ġinverse . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold Key Ġ= Ġinverse . put ( value , Ġkey ) ĊĠĠĠĠĠĠĠ Ġif ( old Key Ġ!= Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove ( old Key ) ĊĠĠĠĠĠĠĠ Ġreturn ĠoldValue ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< K , ĠV > Ġbi Map Of ( var arg Ġpairs : ĠPair < K , ĠV >): ĠBi Map < K , ĠV > Ġ= ĊĠĠĠ Ġmutable Bi Map Of (* pairs ) Ċ fun Ġ< K , ĠV > Ġmutable Bi Map Of ( var arg Ġpairs : ĠPair < K , ĠV >): ĠMutable Bi Map < K , ĠV > Ġ= ĠBi HashMap < K , ĠV >() ĊĠĠĠ Ġ. apply Ġ{ ĊĠĠĠ Ġput All ( pairs ) Ċ } Ċ fun Ġ< K , ĠV > ĠIterable < Pair < K , V >> . to Bi Map () Ġ= Ġmutable Bi Map Of (* this . toList (). to Typed Array ())