package Ġcom . lifecycle . binding . inter Ċ Ċ import Ġandroid . view . View Ċ import Ġcom . lifecycle . binding . IList Adapter Ċ import Ġcom . lifecycle . binding . adapter . Adapter Type Ċ import Ġkotlin . math . min ĊĊ Ċ interface ĠI Select List < E Ġ: ĠSelect > Ġ: ĠIList Adapter < E > Ġ{ ĊĠĠĠ Ġval Ġselect List : ĠMutable List < E > ĊĠĠĠ Ġval Ġmax : ĠInt ĊĊĠĠĠ Ġoverride Ġfun Ġset IEntity ( e : ĠE , Ġposition : ĠInt , Ġtype : ĠInt , Ġview : ĠView ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( type Ġ== ĠAdapter Type . select ) Ġselect ( e , Ġposition ) ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . set IEntity ( e , Ġposition , Ġtype , Ġview ). apply Ġ{ Ġasync Entity ( e , Ġtype ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset List ( position : ĠInt , Ġes : ĠList < E >, Ġtype : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( type Ġ== ĠAdapter Type . select ) Ġselect ( es , Ġposition ) ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . set List ( position , Ġes , Ġtype ). apply Ġ{ Ġfirst Async ( type ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect ( es : ĠList < E >, Ġposition : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġes . forEach Indexed Ġ{ Ġ_, Ġe Ġ-> Ġif Ġ(! select ( e )) Ġb Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect ( e : ĠE , Ġposition : ĠInt Ġ= Ġ- 1 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġif Ġ( position Ġ< Ġ 0 ) Ġadapter List . indexOf ( e ) Ġelse Ġposition ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter List [ p ] Ġ!= Ġe ) Ġthrow ĠRuntimeException (" this Ġe Ġis Ġnot Ġthe Ġsame Ġwith Ġindex Ġof Ġadapter List ") ĊĠĠĠĠĠĠĠ Ġreturn Ġselect Status ( e , Ġ!( select List . contains ( e ). also Ġ{ Ġe . select ( it ) Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect Status ( e : ĠE , Ġcheck : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġasync List () ĊĠĠĠĠĠĠĠ Ġif Ġ( e . isSelected () Ġ== Ġcheck ) Ġreturn Ġcheck ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! e . could Take Back ()) Ġe . select ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġselect List . remove ( e ). let Ġ{ Ġe . select ( false ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . is Push ()) Ġselect List . add ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġe . select ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( select List . size Ġ> Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect List . remove At ( 0 ). select ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġadd ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd ( in E : ĠE ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselect List . size Ġ< Ġmax Ġ&& Ġselect List . add ( in E ). let Ġ{ Ġin E . select ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfirst Async ( type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdapter Type . refresh , ĠAdapter Type . remove Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter List . forEach Ġ{ Ġe Ġ-> Ġe . select ( e . isSelected ()). also Ġ{ Ġif Ġ( it && select List . size < max ) Ġselect List . add ( e ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġasync List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasync Entity ( e : ĠE , Ġtype : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdapter Type . remove Ġ-> Ġselect List . remove ( e ). also Ġ{ Ġif ( it ) e . select ( false ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdapter Type . add Ġ-> Ġselect Status ( e , e . isSelected ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġfun Ġasync List () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( select List . size Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray List Ġ= ĠArrayList < E >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġselect List ) Ġif Ġ( it . is Push ()) Ġarray List . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġselect List . size Ġ- Ġmax ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġmin ( l , Ġarray List . size )- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. min ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect List . remove ( array List [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray List [ index ]. select ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġarray List . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. l Ġ- Ġarray List . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect List . remove At ( select List . last Index ). select ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect List ( list : List < E > Ġ= Ġadapter List , boolean : ĠBoolean Ġ= Ġfalse ){ ĊĠĠĠĠĠĠĠ Ġif ( adapter List Ġ== Ġlist && ! boolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġadapter List ) Ġe . select ( false ) ĊĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġlist ) Ġselect Status ( e , boolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠE . is Push () Ġ= Ġcheck Way Ġand Ġ 1 Ġ== Ġ 1 ĊĊĠĠĠ Ġprivate Ġfun ĠE . could Take Back (): ĠBoolean Ġ= Ġcheck Way Ġshr Ġ 1 Ġand Ġ 1 Ġ== Ġ 1 Ċ }