package Ġorg . k lips . dsl Ċ Ċ import Ġorg . k lips . dsl . Guard . Binary Predicate . Code .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġan Ġabstraction Ġlevel Ġfor Ġvalues Ġ( constants ) Ċ Ġ* Ġand Ġvariables Ġ( references ). ĠThis Ġis Ġrequired Ġto Ġpass Ġconstants Ċ Ġ* Ġor Ġreferences Ġto Ġthe Ġparameters Ġof Ġconstructors Ġof Ġfacts . Ċ Ġ* Ċ Ġ* Ġ@ see ĠFact Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ abstract Ġclass ĠFac et < T > Ġ: ĠComparable < Facet <* >> Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġopen Ġclass ĠConst Facet < T Ġ: ĠComparable < T >>( val Ġvalue Ġ: ĠT ): ĠFac et < T >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠFac et <* >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( other Ġis ĠConst Facet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . compareTo ( other . value Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . name . compareTo ( other . java Class . name ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatch ( f : ĠFac et <* >) Ġ= Ġwhen ( f ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInterval Facet < *> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . java Class Ġ== Ġf . min . java Class Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġin Ġf . min Ġas ĠT Ġ.. Ġf . max Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConst Facet < *> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . java Class Ġ== Ġf . value . java Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġf . value Ġas ĠT Ġ== Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFac et Ref < *> Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġvalue . hashCode () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this Ġ=== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother Ġis ĠConst Facet < *> Ġ&& Ġvalue Ġ== Ġother . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ value / C " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠInterval Facet < T : Comparable < T >>( id : String , Ġval Ġmin : T , Ġval Ġmax : T ): ĠFac et Ref < T >( id ){ ĊĊĠĠĠĠĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( min Ġ> Ġmax ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatch ( f : ĠFac et <* >) Ġ= Ġwhen ( f ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInterval Facet < *> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin . java Class Ġ== Ġf . min . java Class Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . min Ġas ĠT Ġin Ġmin .. max Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . max Ġas ĠT Ġin Ġmin .. max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConst Facet < *> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin . java Class Ġ== Ġf . value . java Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġf . value Ġas ĠT Ġin Ġmin .. max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFac et Ref < *> Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" [$ min .. $ max ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠFac et Ref < T : Comparable < T >>( val Ġid : ĠString ) Ġ: ĠFac et < T > (){ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠFac et < *> ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif ( other Ġis ĠFac et Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . compareTo ( other . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġjava Class . name . compareTo ( other . java Class . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrename ( new Name : String ) Ġ: Facet Ref < T > Ġ= ĠFac et Ref ( new Name ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġdecor ated ( prefix : String Ġ= Ġ"", Ġpostfix : String Ġ= Ġ"") Ġ= Ġrename ("$ prefix $ id $ postfix ") ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġgt ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Gt , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġgt ( t : ĠT ) Ġ: ĠGuard Ġ= Ġgt ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġlt ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Lt , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġlt ( t : ĠT ) Ġ: ĠGuard Ġ= Ġgt ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġge ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Ge , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġge ( t : ĠT ) Ġ: ĠGuard Ġ= Ġge ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġle ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Le , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġle ( t : ĠT ) Ġ: ĠGuard Ġ= Ġle ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġeq ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Eq , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġeq ( t : ĠT ) Ġ: ĠGuard Ġ= Ġeq ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġne ( t : ĠFac et < T >) Ġ= ĠGuard . Binary Predicate ( Ne , Ġthis , Ġt ) ĊĠĠĠĠĠĠĠ Ġin fix Ġfun Ġne ( t : ĠT ) Ġ: ĠGuard Ġ= Ġne ( Const Facet ( t )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatch ( f : ĠFac et <* >) Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ=== Ġthis Ġ|| Ġ( other Ġis ĠFac et Ref < *> Ġ&& Ġid Ġ== Ġother . id ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġid . hashCode () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ id /? " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠInt Facet ( value : Int ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Int >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠLong Facet ( value : Long ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Long >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠFloat Facet ( value : Float ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Float >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠDouble Facet ( value : Double ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Double >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠString Facet ( value : String ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < String >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠDate Facet ( value : ĠDate ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Date >( value ) Ġ{} ĊĊĠĠĠ Ġclass ĠBool Facet ( value : Boolean ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConst Facet < Boolean >( value ) Ġ{} ĊĊĠĠĠ Ġabstract Ġfun Ġmatch ( f : ĠFac et < *> ): ĠBoolean ĊĊĠĠĠ Ġfun Ġbind ( f : ĠFac et < *> ): ĠPair < Facet <* >, ĠFac et <* >> ? Ġ= Ġif Ġ( match ( f )) ĠPair ( f , Ġthis ) Ġelse Ġnull ĊĊĊ Ċ }