Share one Namespace type between gen and macro
diff --git a/syntax/mod.rs b/syntax/mod.rs
index 4eaf81e..21ff447 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -7,6 +7,7 @@
 pub mod error;
 pub mod ident;
 mod impls;
+pub mod namespace;
 mod parse;
 pub mod set;
 mod tokens;
diff --git a/syntax/namespace.rs b/syntax/namespace.rs
new file mode 100644
index 0000000..557e331
--- /dev/null
+++ b/syntax/namespace.rs
@@ -0,0 +1,35 @@
+use std::fmt::{self, Display};
+use std::slice::Iter;
+
+#[derive(Clone)]
+pub struct Namespace {
+    segments: Vec<String>,
+}
+
+impl Namespace {
+    pub fn new(segments: Vec<String>) -> Self {
+        Namespace { segments }
+    }
+
+    pub fn iter(&self) -> Iter<String> {
+        self.segments.iter()
+    }
+}
+
+impl Display for Namespace {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        for segment in self {
+            f.write_str(segment)?;
+            f.write_str("$")?;
+        }
+        Ok(())
+    }
+}
+
+impl<'a> IntoIterator for &'a Namespace {
+    type Item = &'a String;
+    type IntoIter = Iter<'a, String>;
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
+    }
+}