package Ġpf ister . qu icker craft ing . client . gui Ċ Ċ import Ġit . un imi . ds i . fast util . objects . Object A VL Tree Set Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . consume Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . minecraft . item . Item Ċ import Ġnet . minecraft . item . craft ing . I Recipe Ċ import Ġpf ister . qu icker craft ing . LOG Ċ import Ġpf ister . qu icker craft ing . client . craft ing . Recipe Search Ċ import Ġpf ister . qu icker craft ing . client . craft ing . Recipe Worker Ċ import Ġjava . util .* Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ // ĠHandles Ġfiltering ĠCraft able Ġrecipes Ġaccording Ġto Ġthe Ġsearch Ġquery Ġand Ġor Ġwhether Ġ 3 x 3 Ġis Ġcraft able Ċ object ĠDisplay ed Recipe Filter Ġ{ ĊĊĠĠĠ Ġ// ĠThe ĠRecipe Ġdaemon Ġsends Ġover Ġa Ġstream Ġof Ġrecipes Ġand Ġwhether Ġor Ġnot Ġthey Ġneed Ġto Ġbe Ġremoved Ġor Ġadded ĊĠĠĠ Ġval ĠCH ANG ED _ RE CI PE _ CHANNEL : ĠChannel < Pair < I Recipe , ĠBoolean >> Ġ= ĠChannel ( Channel . Factory . UN LIMIT ED ) ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġval ĠDISPLAY ED _ RE CI PE _ DA EM ON Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ ĠCH ANG ED _ RE CI PE _ CHANNEL . consume Each Ġ{ Ġ( recipe , Ġadded ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter ( recipe )) Ġdisplayed Recipes . add ( recipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Recipes . remove ( recipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġvar Ġdisplayed Recipes : ĠObject A VL Tree Set < I Recipe > Ġ= ĠObject A VL Tree Set ( Comparator Ġ{ Ġrecipe 1 , Ġrecipe 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġr 1 Ġ= ĠItem . getId From Item ( recipe 1 . recipe Output . item ) ĊĠĠĠĠĠĠĠ Ġval Ġr 2 Ġ= ĠItem . getId From Item ( recipe 2 . recipe Output . item ) ĊĠĠĠĠĠĠĠ Ġr 1 Ġ- Ġr 2 ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġvar Ġis Searching Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcurrent Search Set : ĠSet < I Recipe > Ġ= Ġset Of () ĊĠĠĠ Ġprivate Ġvar Ġcan Craft 3 x 3 Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠS uffix Ġtree Ġused Ġfor Ġsearching Ġ-- Ġcour tes y Ġof ĠJ EI ĊĠĠĠ Ġ// ĠGo es Ġthrough Ġall Ġthe Ġrecipes Ġin Ġthe Ġgame Ġand Ġthen Ġassoci ates Ġthem Ġwith Ġtheir Ġrecipe Ġoutput 's Ġtooltip Ġtext Ġso Ġwe Ġcan Ġsearch Ġeasily ĊĠĠĠ Ġprivate Ġval Ġrecipe Search : ĠRecipe Search Ġ= ĠRecipe Search () ĊĊĠĠĠ Ġfun Ġset 3 x 3 ( can Craft 3 x 3 : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . can Craft 3 x 3 Ġ!= Ġcan Craft 3 x 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . can Craft 3 x 3 Ġ= Ġcan Craft 3 x 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Recipes () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . can Craft 3 x 3 Ġ= Ġcan Craft 3 x 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Search Term ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Searching Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Search Set Ġ= Ġset Of () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Searching Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Search Set Ġ= Ġrecipe Search . search ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfilter Recipes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Recipes To Display (): ĠList < I Recipe > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdisplayed Recipes . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter ( recipe : ĠI Recipe ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcan Craft Ġ= Ġcan Craft 3 x 3 Ġ|| Ġrecipe . can Fit ( 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Craft ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Searching ) Ġcurrent Search Set . contains ( recipe ) Ġelse Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Recipes () Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info (" Filtering Ġrecipes Ġtook : Ġ" Ġ+ Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Recipes . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin ĠRecipe Worker . Craft able Recipes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter ( r )) Ġdisplayed Recipes . add ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ+ Ġ" ms .") ĊĠĠĠĠĠĠĠ Ġdisplayed Recipes ĊĠĠĠ Ġ} Ċ Ċ }