История изменений
Исправление mix_mix, (текущая версия) :
Ну или вот даже получше будет, так как человеческая система типов.
Попробуй хотя бы такое на ифах запилить, посмотрим насколько код раздует
deleteFixup :: RBZip a -> RBZip a
deleteFixup (RBZip a@(Node Red _ _ _) path) = RBZip (setBlack a) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd c e@(Node Red _ _ _))):path)) =
deleteFixup . topMostZip $ RBZip (Node cb vd (Node Black vb a c) (setBlack e)) path
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e@(Node Red _ _ _) c)):path)) =
deleteFixup . topMostZip $ RBZip (Node cb vd (setBlack e) (Node Black vb c a)) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd (Node Red vc scl scr) e)):path)) =
deleteFixup $ RBZip a ((Step cb vb ToLeft (Node Black vc scl (Node Red vd scr e))):path)
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e (Node Red vc scl scr))):path)) =
deleteFixup $ RBZip a ((Step cb vb ToRight (Node Black vc (Node Red vd e scl) scr)):path)
deleteFixup (RBZip a path) = RBZip (setBlack a) path
Исходная версия mix_mix, :
Ну или вот даже получше будет, так как человеческая система типов. Попробуй хотя бы такое на ифах запилить, посмотрим насколько код раздует
deleteFixup :: RBZip a -> RBZip a
deleteFixup (RBZip a@(Node Red _ _ _) path) = RBZip (setBlack a) path
deleteFixup (RBZip a ((Step _ vb db (Node Red vd l r)):path)) =
deleteFixup $ RBZip a ((Step Red vb db newW):(Step Black vd db newS):path)
where (!newW, !newS) = case db of
ToLeft -> (l,r)
ToRight -> (r,l)
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd c e@(Node Red _ _ _))):path)) =
deleteFixup . topMostZip $ RBZip (Node cb vd (Node Black vb a c) (setBlack e)) path
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e@(Node Red _ _ _) c)):path)) =
deleteFixup . topMostZip $ RBZip (Node cb vd (setBlack e) (Node Black vb c a)) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd (Node Red vc scl scr) e)):path)) =
deleteFixup $ RBZip a ((Step cb vb ToLeft (Node Black vc scl (Node Red vd scr e))):path)
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e (Node Red vc scl scr))):path)) =
deleteFixup $ RBZip a ((Step cb vb ToRight (Node Black vc (Node Red vd e scl) scr)):path)
deleteFixup (RBZip a ((Step cb vb db d@(Node Black _ _ _)):path)) =
deleteFixup $ (RBZip (Node cb vb newL newR) path)
where (!newL, !newR) = case db of
ToLeft -> (a,d')
ToRight -> (d',a)
!d' = setRed d
deleteFixup (RBZip a path) = RBZip (setBlack a) path