Add mergeInDir for kmers
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
index 17f1a11..7d1738e 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
@@ -25,6 +25,7 @@
 import org.apache.hadoop.io.WritableComparator;
 
 import edu.uci.ics.genomix.data.KmerUtil;
+import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 /**
  * Variable kmer length byteswritable
@@ -503,6 +504,25 @@
         appendOneByteAtPosition(preKmer.kmerlength - initialKmerSize + k - 4 + 1, cacheByte, bytes, offset, size);
         clearLeadBit();
     }
+    
+    public void mergeWithKmerInDir(byte dir, int initialKmerSize, KmerBytesWritable kmer) {
+        switch(dir & DirectionFlag.DIR_MASK) {
+            case DirectionFlag.DIR_FF:
+                mergeWithFFKmer(initialKmerSize, kmer);
+                break;
+            case DirectionFlag.DIR_FR:
+                mergeWithFRKmer(initialKmerSize, kmer);
+                break;
+            case DirectionFlag.DIR_RF:
+                mergeWithRFKmer(initialKmerSize, kmer);
+                break;
+            case DirectionFlag.DIR_RR:
+                mergeWithRRKmer(initialKmerSize, kmer);
+                break;
+            default:
+                throw new RuntimeException("Direciotn not recognized: " + dir);
+        }
+    }
 
     public static void appendOneByteAtPosition(int k, byte onebyte, byte[] buffer, int start, int length) {
         int position = start + length - 1 - k / 4;
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
index a7e8157..3ed0e4e 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
@@ -38,7 +38,8 @@
         public static final byte EXTRA_FLAG = 1 << 6;
     }
 
-    public void setAsUpdateMessage(byte mergeDir, byte neighborDir, PositionWritable nodeToDelete, PositionWritable nodeToAdd) {
+    public void setAsUpdateMessage(byte mergeDir, byte neighborDir, PositionWritable nodeToDelete,
+            PositionWritable nodeToAdd) {
         byte neighborToMeDir = mirrorDirection(neighborDir);
         byte neighborToMergeDir = flipDirection(neighborToMeDir, mergeDir);
 
@@ -53,8 +54,6 @@
         node.getListFromDir(neighborToMergeDir).append(nodeToAdd);
     }
 
-
-
     /*
      * Returns the edge dir for B->A when the A->B edge is type @dir
      */
@@ -118,22 +117,7 @@
             // remove position and merge its position lists with node
             if (!updateNode.equals(NodeWritable.EMPTY_NODE)) {
                 // need to remove updateNode from the specified PositionList
-                switch (updateFlag & MessageFlag.DIR_MASK) {
-                    case MessageFlag.DIR_FF:
-                        node.getFFList().remove(updateNode.getNodeID());
-                        break;
-                    case MessageFlag.DIR_FR:
-                        node.getFRList().remove(updateNode.getNodeID());
-                        break;
-                    case MessageFlag.DIR_RF:
-                        node.getRFList().remove(updateNode.getNodeID());
-                        break;
-                    case MessageFlag.DIR_RR:
-                        node.getRRList().remove(updateNode.getNodeID());
-                        break;
-                    default:
-                        throw new IOException("Unrecognized direction in updateFlag: " + updateFlag);
-                }
+                node.getListFromDir(updateFlag).remove(updateNode.getNodeID());
             }
             // now merge positionlists from update and node
             node.getFFList().appendList(updateNode.getFFList());
@@ -142,13 +126,16 @@
             node.getRRList().appendList(updateNode.getRRList());
         } else if ((updateFlag & MessageFlag.MSG_UPDATE_MERGE) == MessageFlag.MSG_UPDATE_MERGE) {
             // this message wants to merge node with updateNode.
-            // the direction flag indicates how the merge should take place.
-            // TODO send update or remove edge that I merge with
+            // the direction flag indicates node's relationship with updateNode
+            node.getListFromDir(updateFlag).remove(updateNode.getNodeID()); // remove the node from my edges
+            node.getKmer().mergeWithKmerInDir(updateFlag, kmerSize, updateNode.getKmer()); // merge with its kmer
+
+            // merge my edges with the incoming node's edges, accounting for if the node flipped in 
+            // the merge and if it's my predecessor or successor
             switch (updateFlag & MessageFlag.DIR_MASK) {
                 case MessageFlag.DIR_FF:
-                    node.getKmer().mergeWithFFKmer(kmerSize, updateNode.getKmer());
                     node.getFFList().set(updateNode.getFFList());
-                    // TODO not just FF list here-- FR as well
+                    node.getFRList().set(updateNode.getFRList());
                     break;
                 case MessageFlag.DIR_FR:
                     // FIXME not sure if this should be reverse-complement or just reverse...