package Ġcom . github . ch ristop h pick l . k pot p our ri . common . collection Ċ Ċ import Ġmu . Kotlin Logging . logger Ċ Ċ private Ġval Ġlog Ġ= Ġlogger Ġ{} Ċ Ċ data Ġclass ĠNe ighbours < T >( ĊĠĠĠ Ġval Ġprevious : ĠT ?, ĊĠĠĠ Ġval Ġnext : ĠT ? Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġempty () Ġ= ĠNe ighbours < T >( null , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< FROM , ĠTO > ĠPair < FROM ?, ĠFROM ?> . to Ne ighbours ( transformer : Ġ( FROM ?) Ġ-> ĠTO ?): ĠNe ighbours < TO > Ġ= ĊĠĠĠ ĠNe ighbours ( transformer ( first ), Ġtransformer ( second )) Ċ Ċ fun Ġ< T , ĠX > ĠList < T >. ne ighbours For ( pivot : ĠT , Ġmatch Field : ĠT . () Ġ-> ĠX ): ĠPair < T ?, ĠT ?> Ġ{ ĊĠĠĠ Ġval Ġpivot Field Ġ= Ġpivot . match Field () ĊĠĠĠ Ġval Ġpivot Index Ġ= ĠindexOf First Ġ{ Ġit . match Field () Ġ== Ġpivot Field Ġ} ĊĠĠĠ Ġrequire ( pivot Index Ġ!= Ġ- 1 ) Ġ{ Ġ" Given Ġpivot Ġ($ pivot Field ) Ġcould Ġnot Ġbe Ġfound Ġin Ġlist ! Ġ(${ join ToString Ġ{ Ġit . match Field (). toString () Ġ} })" Ġ} ĊĊĠĠĠ Ġval Ġprev Ġ= Ġif Ġ( pivot Index Ġ== Ġ 0 ) Ġnull Ġelse Ġthis [ pivot Index Ġ- Ġ 1 ] ĊĠĠĠ Ġval Ġnext Ġ= Ġif Ġ( pivot Index Ġ== Ġsize Ġ- Ġ 1 ) Ġnull Ġelse Ġthis [ pivot Index Ġ+ Ġ 1 ] ĊĊĠĠĠ Ġlog . trace Ġ{ Ġ" Prev / Next Ġfor Ġpivot Ġindex Ġ($ pivot Index ): Ġ${ prev ?. match Field ()} Ġ/ Ġ${ next ?. match Field () }" Ġ} ĊĠĠĠ Ġreturn Ġprev Ġto Ġnext Ċ } Ċ