insert :: ExprTree a -> Label -> Fun -> Side -> ExprTree a -> ExprTree a
-- ^ guess what - inserts a tree at label on given side into given tree
insert shrubbery here withfun onSide toTree
        | l == here = forkWith shrubbery withfun onSide toTree
        | here < l = Node l f (insert shrubbery here withfun onSide lb) rb
        | here > l = Node l f lb (insert shrubbery here withfun onSide rb)
        | otherwise = error "label out of range"
        where (Node _ f lb rb) = toTree
              l = lab toTree
insert :: ExprTree a -> Label -> Fun -> Side -> ExprTree a -> ExprTree a
insert shrubbery here withfun onSide toTree
        | l == here = forkWith shrubbery withfun onSide toTree
        | here < l = Node l f (insert shrubbery here withfun onSide lb) rb
        | here > l = Node l f lb (insert shrubbery here withfun onSide rb)
        | otherwise = error "label out of range"
        where (Node _ f lb rb) = toTree
              l = lab toTree
insert shrubbery here withfun onSide toTree
        | l == here = forkWith shrubbery withfun onSide toTree
        | here < l = Node l f (insert shrubbery here withfun onSide lb) rb
        | here > l = Node l f lb (insert shrubbery here withfun onSide rb)
        | otherwise = error "label out of range"
        where (Node _ f lb rb) = toTree
              l = lab toTree