chiark / gitweb /
More things.
[wordchain] / chain.rs
index 9330746457cced6a20f427688987db89bc29d0dd..a75b2a6c8fff84320c5fcd286c5a234e24b2b7ae 100644 (file)
--- a/chain.rs
+++ b/chain.rs
@@ -1,6 +1,5 @@
 use std::cell::Cell;
 use std::io::{self, BufRead, Write};
-use std::ptr;
 
 use typed_arena;
 
@@ -60,9 +59,9 @@ fn main() -> io::Result<()> {
     let n = line.len();
     if n == 0 { break; }
     if line[n - 1] == b'\n' { line = &line[0 .. n - 1]; }
-//stdout.write_all(b";; read `")?;
-//stdout.write_all(line)?;
-//stdout.write_all(b"'\n")?;
+    //stdout.write_all(b";; read `")?;
+    //stdout.write_all(line)?;
+    //stdout.write_all(b"'\n")?;
     let word: &[u8] = byte_arena.alloc_extend(line.iter().map(|p| *p));
     if let MapEntry::Vacant(e) = map.entry(word) {
       e.insert(node_arena.alloc(Node { word: word, .. Node::default() }));
@@ -75,31 +74,32 @@ fn main() -> io::Result<()> {
 
   let mut max = 0;
   for node in map.values() {
-//stdout.write_all(b";; ponder `")?;
-//stdout.write_all(node.word)?;
-//stdout.write_all(b"'\n")?;
+    //stdout.write_all(b";; ponder `")?;
+    //stdout.write_all(node.word)?;
+    //stdout.write_all(b"'\n")?;
     let mut node: &Node = node;
     let mut parent;
     let n = node.word.len();
     if n <= 1 { parent = None; }
     else { parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n); }
     node.up.set(parent);
+    let mut nlen = node.len.get();
     while let Some(parent_node) = parent {
-      let plen = parent_node.len.get();
-      let nlen = node.len.get() + 1;
-      if plen > nlen { break; }
-      if plen < nlen { parent_node.down.set(None); }
-      match parent_node.down.get() {
-        Some(link) if ptr::eq(link, node) => (),
-        _ => {
-          node.right.set(parent_node.down.get());
-          parent_node.down.set(Some(node));
-        }
+      let plen = parent_node.len.get(); nlen += 1;
+      if plen > nlen
+        { break; }
+      else if plen == nlen {
+        node.right.set(parent_node.down.get());
+        parent_node.down.set(Some(node));
+        break;
+      } else {
+        parent_node.down.set(Some(node));
+        node.right.set(None);
+        parent_node.len.set(nlen);
+        node = parent_node; parent = node.up.get();
       }
-      parent_node.len.set(nlen);
-      if nlen > max { max = nlen; }
-      node = parent_node; parent = node.up.get()
     }
+    if nlen > max { max = nlen; }
   }
 
   for node in map.values() {