             (go (func t (first vec)) (rest vec) func filename))))
 
 (println "Forwards..")
-(def t1 (go (finger-tree-empty.) (range 1 20) push-front "/tmp/forwards.dot"))
+(def t1 (go (make-finger-tree-empty count-monoid) (range 1 20) push-front "/tmp/forwards.dot"))
 
 (println "Backwards..")
-(def t2 (go (finger-tree-empty.) (range 20 40) push-back "/tmp/backwards.dot"))
+(def t2 (go (make-finger-tree-empty count-monoid) (range 20 40) push-back "/tmp/backwards.dot"))
 
 (print-finger-tree-to-file
     (concatenate t1 t2)

(defmethod print-finger-tree finger-tree-empty [_ _] nil)
(defmethod print-finger-tree finger-tree-single [node parent-id]
    (do
        (println (object-id node) " [label=\"Single\"]")
        (when parent-id (println parent-id " -> " (object-id node) " [weight=4]"))
        (print-entry (:v node) (object-id node))))
(defmethod print-finger-tree finger-tree-deep [node parent-id]
    (do
        (println (object-id node) " [label=\"Deep\"]")
        (when parent-id (println parent-id " -> " (object-id node) " [weight=4]"))
        (print-digits (:l node) (object-id node))
        (print-finger-tree (force (:m node)) (object-id node))

(defmethod concatenate [::any finger-tree-empty] [a _] a)
(defmethod concatenate [finger-tree-empty ::any] [_ b] b)
(defmethod concatenate [::any finger-tree-single] [a b]
    (push-back a (:e b)))
(defmethod concatenate [finger-tree-single ::any] [a b]
    (push-front (:e a) b))
(defmethod concatenate [finger-tree-deep finger-tree-deep] [a b]
    (make-finger-tree-deep
        (:monoid a)
        (:l a)
        (app3 (force (:m a)) (apply nodes (:monoid a) (concat (:r a) (:l b))) (force (:m b)))
        (:r b)))

; Functions to print finger-trees to graphviz
