From fcbba23e577176b22b66ce920fe933c38df2867f Mon Sep 17 00:00:00 2001 From: Adrian Cochrane Date: Mon, 20 Apr 2020 18:34:37 +1200 Subject: [PATCH] Implement style tree flattening utility. This will be useful in Rhapsode for making sure voice synthesizers continue to have full voice features information as the user jumps around the document. And it will be useful for visual browsers in transitioning from layout to render. --- src/Data/CSS/StyleTree.hs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Data/CSS/StyleTree.hs b/src/Data/CSS/StyleTree.hs index 97e191a..6b7a6fa 100644 --- a/src/Data/CSS/StyleTree.hs +++ b/src/Data/CSS/StyleTree.hs @@ -1,7 +1,7 @@ -- | Abstracts away tree traversals. -- Mostly used by callers including (soon) XML Conduit Stylist, -- but also used internally for generating counter text. -module Data.CSS.StyleTree(StyleTree(..), treeOrder, treeOrder', Path, treeMap) where +module Data.CSS.StyleTree(StyleTree(..), treeOrder, treeOrder', Path, treeMap, treeFlatten) where data StyleTree p = StyleTree { style :: p, @@ -26,3 +26,10 @@ treeOrder' _ _ _ [] _ = error "Invalid path during tree traversal!" treeMap :: (p -> p') -> StyleTree p -> StyleTree p' treeMap cb = treeOrder (\_ _ _ p -> ((), cb p)) () + +treeFlatten :: StyleTree p -> [p] +treeFlatten = treeFlatten' . children +treeFlatten' :: [StyleTree p] -> [p] +treeFlatten' (StyleTree p []:ps) = p : treeFlatten' ps +treeFlatten' (StyleTree _ childs:sibs) = treeFlatten' childs ++ treeFlatten' sibs +treeFlatten' [] = [] -- 2.30.2