--- /dev/null
+package org.simantics.scl.compiler.types.util;
+
+
+public enum Polarity {
+ NO_POLARITY("?"),
+ POSITIVE("+"),
+ NEGATIVE("-"),
+ BIPOLAR("=");
+
+ private Polarity(String symbol) {
+ this.symbol = symbol;
+ }
+
+ private final String symbol;
+ private Polarity flipped;
+ private Polarity[] combi = new Polarity[4];
+
+ static {
+ for(int ia=0;ia<4;++ia) {
+ Polarity a = values()[ia];
+ a.flipped = values()[ ((ia&1)<<1) | ((ia&2)>>1) ];
+ for(int ib=0;ib<4;++ib) {
+ a.combi[ib] = values()[ia | ib];
+ }
+ }
+ }
+
+ public Polarity flip() {
+ return flipped;
+ }
+
+ public Polarity add(Polarity other) {
+ return combi[other.ordinal()];
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
+
+ public boolean isPositive() {
+ return (ordinal()&1) != 0;
+ }
+
+ public boolean isNegative() {
+ return (ordinal()&2) != 0;
+ }
+}