;; Simple home-made list example
  
  (require "apf.scm")

  ;; Define our structures...
  (abstract List (Cons Empty))
  (concrete Empty ("*"))
  (concrete Cons ((first number) (rest List)))
  
  ;; Some useful "functions"
  (define Sum (union-id [(Empty) (e) 0]
                        [(Cons number number) (c f r) (+ f r)]))
  (define Len (union-func (funcset [(number) (n) 1])
                          Sum))
  
  ;; A Data Instance
  (define aList (parse-string 'List "4 2 7 1 *"))
  
  ;; Compute a little through the traversal
  (traverse-b aList Len)
  (traverse-b aList Sum)
  
  ;; A builder for to-string
  (define StrB (union-id
                [(number) (n) (number->string n)]
                [(Cons string string) (c f r) (string-append "(" f " " r ")")]
                [(Empty) (e) "()"]))
  
  
  ;; Wrap the traversal into a simpler method
  (define (List->string lst)
    (traverse-b lst StrB))

  ;; This looks better, right?
  (List->string aList)
  
  ;; Test Function for the Bc Builder...
  (List->string (traverse-b aList (union-Bc [(number) (n) (+ n 1)])))

  ;; Do the accumulator style length function
  (traverse-ba aList
               (union-id [(Cons object number) (c f r) r]
                         [(Empty number) (e n) n])
               (union-idA [(Cons Cons.rest number) (c f n) (add1 n)]) 0)