label :: Tree a -> Tree (a, Int) label t = let (y,_) = runState (label' t) 0 in y where label' Empty = return Empty label' (Node x t1 t2) = do i <- get set (\i -> i+1) t1' <- label' t1 t2' <- label' t2 return (Node (x,i+1) t1' t2' )