/src/main/java/de/jbee/lang/Operator.java

http://github.com/jbee/jadamant · Java · 162 lines · 124 code · 38 blank · 0 comment · 4 complexity · 1e0607cb27f6b25127089312c3751537 MD5 · raw file

  1. package de.jbee.lang;
  2. import de.jbee.lang.dev.Null;
  3. import de.jbee.lang.dev.Nullproof;
  4. import de.jbee.lang.dev.Nullsave;
  5. public final class Operator {
  6. public static final Op<Object> minimum = minimumBy( Order.inherent );
  7. public static final Op<Object> maximim = maximumBy( Order.inherent );
  8. public static final Op<Object> elvis = new ElvisOp<Object>();
  9. private Operator() {
  10. throw new UnsupportedOperationException( "util" );
  11. }
  12. public static <T> Op<T> maximumBy( Ord<T> order ) {
  13. return order == Order.inherent
  14. ? Cast.<T> genericDowncast( maximim )
  15. : new MaximumOp<T>( order );
  16. }
  17. public static <T> Op<T> minimumBy( Ord<T> order ) {
  18. return order == Order.inherent
  19. ? Cast.<T> genericDowncast( minimum )
  20. : new MinimumOp<T>( order );
  21. }
  22. public static <T> RelationalOp<T> not( RelationalOp<T> op ) {
  23. return op instanceof NegateRelationalOp<?>
  24. ? ( (NegateRelationalOp<T>) op ).op
  25. : new NegateRelationalOp<T>( op );
  26. }
  27. public static <T> RelationalOp<T> ltBy( Ord<? super T> order ) {
  28. return new OrderRelationalOp<T>( order, Ordering.GT );
  29. }
  30. public static <T> RelationalOp<T> gtBy( Ord<? super T> order ) {
  31. return new OrderRelationalOp<T>( order, Ordering.LT );
  32. }
  33. public static <T> RelationalOp<T> eqBy( Ord<? super T> order ) {
  34. return new OrderRelationalOp<T>( order, Ordering.EQ );
  35. }
  36. public static <T> RelationalOp<T> notEqBy( Ord<? super T> order ) {
  37. return not( eqBy( order ) );
  38. }
  39. public static <T> RelationalOp<T> geBy( Ord<? super T> order ) {
  40. return not( ltBy( order ) );
  41. }
  42. public static <T> RelationalOp<T> leBy( Ord<? super T> order ) {
  43. return not( gtBy( order ) );
  44. }
  45. static final class ElvisOp<T>
  46. implements Op<T>, Nullsave {
  47. @Override
  48. public T operate( T left, T right ) {
  49. return left == null
  50. ? right
  51. : left;
  52. }
  53. }
  54. static final class MaximumOp<T>
  55. implements Op<T>, Nullproof {
  56. private final Ord<T> ord;
  57. MaximumOp( Ord<T> ord ) {
  58. super();
  59. this.ord = ord;
  60. }
  61. @Override
  62. public T operate( T left, T right ) {
  63. return ord.ord( left, right ).isGt()
  64. ? left
  65. : right;
  66. }
  67. @Override
  68. public boolean isNullsave() {
  69. return Null.isSave( ord );
  70. }
  71. }
  72. static final class MinimumOp<T>
  73. implements Op<T>, Nullproof {
  74. private final Ord<T> ord;
  75. MinimumOp( Ord<T> ord ) {
  76. super();
  77. this.ord = ord;
  78. }
  79. @Override
  80. public T operate( T left, T right ) {
  81. return ord.ord( left, right ).isLe()
  82. ? left
  83. : right;
  84. }
  85. @Override
  86. public boolean isNullsave() {
  87. return Null.isSave( ord );
  88. }
  89. }
  90. static final class OrderRelationalOp<T>
  91. implements RelationalOp<T>, Nullproof {
  92. private final Ord<? super T> ord;
  93. private final Ordering expected;
  94. OrderRelationalOp( Ord<? super T> ord, Ordering expected ) {
  95. super();
  96. this.ord = ord;
  97. this.expected = expected;
  98. }
  99. @Override
  100. public boolean holds( T left, T right ) {
  101. return ord.ord( left, right ) == expected;
  102. }
  103. @Override
  104. public boolean isNullsave() {
  105. return Null.isSave( ord );
  106. }
  107. }
  108. static final class NegateRelationalOp<T>
  109. implements RelationalOp<T>, Nullproof {
  110. final RelationalOp<T> op;
  111. NegateRelationalOp( RelationalOp<T> op ) {
  112. super();
  113. this.op = op;
  114. }
  115. @Override
  116. public boolean holds( T left, T right ) {
  117. return !op.holds( left, right );
  118. }
  119. @Override
  120. public boolean isNullsave() {
  121. return Null.isSave( op );
  122. }
  123. }
  124. }