module FPPrac.Trees.RedBlackTree ( showRBTree , showRBTreeList , RBTreeG(..) , ColorG(..) , exampleTree )where import FPPrac.Trees.GeneralTree import FPPrac.Trees.LayoutTree import EventLoop.Output data ColorG = RedG | BlackG | GreyG data RBTreeG = RBNodeG ColorG String [RBTreeG] instance GeneralizeTree RBTreeG where generalizeTree (RBNodeG col _ []) = GeneralTreeBox content [] where content = [GeneralNode (colorGToColor col) 5] generalizeTree (RBNodeG col str children) = GeneralTreeBox content children'WithLines where content = [GeneralNode (colorGToColor col) 20, GeneralNodeText (0,0,0) str] children' = map generalizeTree children line = GeneralLine (0,0,0) children'WithLines = zip (repeat line) children' colorGToColor :: ColorG -> Color colorGToColor RedG = (255, 0, 0) colorGToColor BlackG = (0, 0, 0) colorGToColor GreyG = (125, 125, 125) showRBTree :: RBTreeG -> IO () showRBTree rbTree = showRBTreeList [rbTree] showRBTreeList :: [RBTreeG] -> IO () showRBTreeList rbTrees = outSingle (OutGraphical (Draw (showRBTreeList' 0 0 rbTrees) "trees")) showRBTreeList' :: TopOffset -> Int -> [RBTreeG] -> GObject showRBTreeList' _ _ [] = Container [] showRBTreeList' top i (rbTree:ts) = Container (text:pGeneral:gts) where (Container gts) = showRBTreeList' top' i' ts top' = 10 + bottomGeneral --(max bottomGeneral bottomRB) (lGeneral, rightGeneral, bottomGeneral) = layoutGeneralTree 0 top (generalizeTree rbTree) --(lRB, _, bottomRB) = layoutRBTree (rightGeneral + 30) top rbTree pGeneral = printTree lGeneral --pRB = printTree lRB i' = i + 1 text = treeIndex i (0, top) layoutRBTree :: LeftOffset -> TopOffset -> RBTreeG -> (LayoutTree, RightOffset, BottomOffset) layoutRBTree left top rbTree = layoutGeneralTree left top $ generalizeTree rbTree exampleTree = RBNodeG BlackG "12" [ RBNodeG RedG "11" [ RBNodeG BlackG "16" [ RBNodeG BlackG "" [], RBNodeG BlackG "" [] ], RBNodeG BlackG "24" [RBNodeG BlackG "" [], RBNodeG BlackG "" [] ] ], RBNodeG RedG "13" [RBNodeG BlackG "36" [], RBNodeG BlackG "28" [RBNodeG RedG "36" [RBNodeG BlackG "" [], RBNodeG BlackG "" [] ], RBNodeG BlackG "" [] ] ] ]