koktibajs
public text v1 · immutablelabel :: 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' )