diff --git a/examples/glue.c b/examples/glue.c
index 1457f6f9f695eaac7e8ed6b656568d050b0e3415..3a8f6cb6073e98b2d5ba108e74765b2e214e9f0f 100644
--- a/examples/glue.c
+++ b/examples/glue.c
@@ -135,50 +135,26 @@ HParsedToken *h_seq_index(const HParsedToken *p, size_t i)
   return h_carray_index(p->seq, i);
 }
 
-HParsedToken *h_seq_index_path(HParsedToken *p, ...)
+HParsedToken *h_seq_index_path(const HParsedToken *p, size_t i, ...)
 {
   va_list va;
 
-  va_start(va, p);
-  p = h_seq_index_vpath(p, va);
+  va_start(va, i);
+  HParsedToken *ret = h_seq_index_vpath(p, i, va);
   va_end(va);
 
-  return p;
-}
-
-HParsedToken *h_seq_index_vpath(HParsedToken *p, va_list va)
-{
-  int i;
-
-  while((i = va_arg(va, int)) >= 0)
-    p = h_seq_index(p, i);
-
-  return p;
-}
-
-HCountedArray *h_seq_index_seq(const HParsedToken *p, size_t i)
-{
-  return h_cast_seq(h_seq_index(p, i));
-}
-
-HBytes h_seq_index_bytes(const HParsedToken *p, size_t i)
-{
-  return h_cast_bytes(h_seq_index(p, i));
+  return ret;
 }
 
-int64_t h_seq_index_sint(const HParsedToken *p, size_t i)
+HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va)
 {
-  return h_cast_sint(h_seq_index(p, i));
-}
+  HParsedToken *ret = h_seq_index(p, i);
+  int j;
 
-uint64_t h_seq_index_uint(const HParsedToken *p, size_t i)
-{
-  return h_cast_uint(h_seq_index(p, i));
-}
+  while((j = va_arg(va, int)) >= 0)
+    ret = h_seq_index(p, j);
 
-void *h_seq_index_user(HTokenType type, const HParsedToken *p, size_t i)
-{
-  return h_cast(type, h_seq_index(p, i));
+  return ret;
 }
 
 void h_seq_snoc(HParsedToken *xs, const HParsedToken *x)
diff --git a/examples/glue.h b/examples/glue.h
index cd5e4eff53c234563d5935f84b8f58fc3b703b7d..1dc2fbd8c00526c3c07eed4585626390c5c23fc1 100644
--- a/examples/glue.h
+++ b/examples/glue.h
@@ -84,26 +84,24 @@ HParsedToken **h_seq_elements(const HParsedToken *p);
 HParsedToken *h_seq_index(const HParsedToken *p, size_t i);
 
 // Access an element in a nested sequence by a path of indices.
-HParsedToken *h_seq_index_path(HParsedToken *p, ...);
-HParsedToken *h_seq_index_vpath(HParsedToken *p, va_list va);
+HParsedToken *h_seq_index_path(const HParsedToken *p, size_t i, ...);
+HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va);
 
-// Convenience functions combining index access and h_cast_*.
-HCountedArray *h_seq_index_seq  (const HParsedToken *p, size_t i);
-HBytes         h_seq_index_bytes(const HParsedToken *p, size_t i);
-int64_t        h_seq_index_sint (const HParsedToken *p, size_t i);
-uint64_t       h_seq_index_uint (const HParsedToken *p, size_t i);
-void *         h_seq_index_user (HTokenType type, const HParsedToken *p, size_t i);
-
-// Standard short-hand to access and cast a user-type sequence element.
+// Convenience macros combining (nested) index access and h_cast.
 #define H_INDEX(TYP, SEQ, ...) \
-  ((TYP *) h_cast(TT_ ## TYP, h_seq_index_path(SEQ, __VA_ARGS__, -1)))
+  ((TYP *) h_cast(TT_ ## TYP, H_INDEX_TOKEN(SEQ, __VA_ARGS__)))
+#define H_INDEX_SEQ(SEQ, ...)    h_cast_seq(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
+#define H_INDEX_BYTES(SEQ, ...)  h_cast_bytes(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
+#define H_INDEX_SINT(SEQ, ...)   h_cast_sint(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
+#define H_INDEX_UINT(SEQ, ...)   h_cast_uint(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
+#define H_INDEX_TOKEN(SEQ, ...)  h_seq_index_path(SEQ, __VA_ARGS__, -1)
 
 // Standard short-hand to access and cast elements on a sequence token.
 #define H_FIELD(TYP, ...)  H_INDEX(TYP, p->ast, __VA_ARGS__)
-#define H_FIELD_SEQ(IDX)   h_seq_index_seq(p->ast, IDX)
-#define H_FIELD_BYTES(IDX) h_seq_index_bytes(p->ast, IDX)
-#define H_FIELD_SINT(IDX)  h_seq_index_sint(p->ast, IDX)
-#define H_FIELD_UINT(IDX)  h_seq_index_uint(p->ast, IDX)
+#define H_FIELD_SEQ(...)   H_INDEX_SEQ(p->ast, __VA_ARGS__)
+#define H_FIELD_BYTES(...) H_INDEX_BYTES(p->ast, __VA_ARGS__)
+#define H_FIELD_SINT(...)  H_INDEX_SINT(p->ast, __VA_ARGS__)
+#define H_FIELD_UINT(...)  H_INDEX_UINT(p->ast, __VA_ARGS__)
 
 // Lower-level helper for h_seq_index.
 HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal
diff --git a/examples/rr.c b/examples/rr.c
index 38edd18a17e0467fbdb9e0d50bb6cc50091da3d9..1e74370c03044d47c0d9dbb8f9e5b54efa441ab3 100644
--- a/examples/rr.c
+++ b/examples/rr.c
@@ -37,7 +37,7 @@ const HParsedToken *act_txt(const HParseResult *p) {
     size_t len = h_seq_len(arr->elements[i]);
     uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*len);
     for (size_t j=0; j<len; ++j)
-      tmp[j] = h_seq_index_uint(arr->elements[i], j);
+      tmp[j] = H_INDEX_UINT(arr->elements[i], j);
     ret[i] = tmp;
   }
 
@@ -82,7 +82,7 @@ const HParsedToken* act_wks(const HParseResult *p) {
   wks->len      = H_FIELD_SEQ(2)->used;
   wks->bit_map  = h_arena_malloc(p->arena, sizeof(uint8_t)*wks->len);
   for (size_t i=0; i<wks->len; ++i)
-    wks->bit_map[i] = h_seq_index_uint(h_seq_index(p->ast, 2), i);
+    wks->bit_map[i] = H_INDEX_UINT(p->ast, 2, i);
 
   return H_MAKE(dns_rr_wks_t, wks);
 }