/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . test . util Ċ Ċ import Ġjava . util .* Ċ Ċ fun Ġinterface ĠCondition < in ĠT > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( value : ĠT ): ĠBoolean Ċ } Ċ Ċ object ĠConditions Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTRUE Ġ= ĠCondition < Any ?> Ġ{ Ġtrue Ġ} ĊĠĠĠ Ġprivate Ġval ĠFALSE Ġ= ĠCondition < Any ?> Ġ{ Ġfalse Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġalways True (): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTRUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġalways False (): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFALSE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnot Null (): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġit Ġ!= Ġnull Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġconstant ( value : ĠBoolean ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value ) Ġalways True () Ġelse Ġalways False () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġinstance Of ( clazz : ĠClass < *> ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġclazz . is Instance ( t ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnot InstanceOf ( clazz : ĠClass < *> ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġ! clazz . is Instance ( t ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassignable To ( clazz : ĠClass < *> ): ĠCondition < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġclazz . isAssignableFrom ( t ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġinstance Of ( var arg Ġclazz : ĠClass < *> ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( aClass Ġin Ġclazz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( aClass . is Instance ( t )) Ġreturn @ Condition Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġ` is `( option : ĠT ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠequalTo ( option ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠequalTo ( option : ĠAny ?): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġt Ġ== Ġoption Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnot EqualTo ( option : ĠAny ?): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġt Ġ!= Ġoption Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġone Of ( var arg Ġoptions : ĠT ): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġone Of ( options . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġone Of ( options : ĠCollection < T >): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġt Ġ-> Ġoptions . contains ( t ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnot ( c : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ=== Ġalways True < Any >()) Ġreturn Ġalways False () ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ=== Ġalways False < Any >()) Ġreturn Ġalways True () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( c Ġis ĠNot <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( c Ġas ĠNot < T >). c Ġas ĠCondition < T > ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠNot ( c ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġand ( c 1 : ĠCondition < T >, Ġc 2 : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c 1 Ġ=== Ġalways True < Any >() Ġ|| Ġc 2 Ġ=== Ġalways False < Any >()) Ġreturn Ġc 2 ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( c 2 Ġ=== Ġalways True < Any >() Ġ|| Ġc 1 Ġ=== Ġalways False < Any >()) Ġc 1 Ġelse ĠAnd ( c 1 , Ġc 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġor ( c 1 : ĠCondition < T >, Ġc 2 : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c 1 Ġ=== Ġalways False < Any >() Ġ|| Ġc 2 Ġ=== Ġalways True < Any >()) Ġreturn Ġc 2 ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( c 2 Ġ=== Ġalways False < Any >() Ġ|| Ġc 1 Ġ=== Ġalways True < Any >()) Ġc 1 Ġelse ĠOr ( c 1 , Ġc 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< A , ĠB > Ġcompose ( func : Ġ( A ) Ġ-> ĠB , Ġcondition : ĠCondition < B >): ĠCondition < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCondition Ġ{ Ġcondition . invoke ( func ( it )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġcached ( c : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSoft Ref Cache ( c ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNot < T >( val Ġc : ĠCondition < T >) Ġ: ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( value : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! c . invoke ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠAnd < T >( val Ġc 1 : ĠCondition < T >, Ġval Ġc 2 : ĠCondition < T >) Ġ: ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( value : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġc 1 . invoke ( value ) Ġ&& Ġc 2 . invoke ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOr < T >( val Ġc 1 : ĠCondition < T >, Ġval Ġc 2 : ĠCondition < T >) Ġ: ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( value : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġc 1 . invoke ( value ) Ġ|| Ġc 2 . invoke ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSoft Ref Cache < T >( private Ġval Ġmy Condition : ĠCondition < T >) Ġ: ĠCondition < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Cache : ĠWeak HashMap < T , ĠBoolean > Ġ= ĠWeak HashMap (); ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( value : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Cache . compute If Absent ( value ) Ġ{ Ġmy Condition ( value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ infix Ġfun Ġ< T > ĠCondition < T >. and ( other : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠ Ġreturn ĠConditions . and ( this , Ġother ) Ċ } Ċ Ċ infix Ġfun Ġ< T > ĠCondition < T >. or ( other : ĠCondition < T >): ĠCondition < T > Ġ{ ĊĠĠĠ Ġreturn ĠConditions . or ( this , Ġother ) Ċ } Ċ Ċ operator Ġfun Ġ< T > ĠCondition < T >. not (): ĠCondition < T > Ġ{ ĊĠĠĠ Ġreturn ĠConditions . not ( this ) Ċ } Ċ Ċ fun Ġ< T > ĠCondition < T >. cached (): ĠCondition < T > Ġ{ ĊĠĠĠ Ġreturn ĠConditions . cached ( this ) Ċ } Ċ