Add file
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
module Dodge.DoubleTree where
|
||||
|
||||
import Dodge.Data.DoubleTree
|
||||
|
||||
-- conceptually, in a tree growing from left to right,
|
||||
-- bottom -> top is equated with left -> right.
|
||||
-- this does not match with thinking of a list as top -> bottom, so take care
|
||||
doubleTreeToIndentList :: DoubleTree a -> [(a,Int,DoubleTreeNodeType)]
|
||||
doubleTreeToIndentList = dtIL DTRootNode
|
||||
|
||||
dtIL :: DoubleTreeNodeType -> DoubleTree a -> [(a,Int,DoubleTreeNodeType)]
|
||||
dtIL nt (DT x l r) = map doindent (concat (headMap (dtIL DTBottomNode) (dtIL DTMidBelowNode) l))
|
||||
++ [(x,0,nt)]
|
||||
++ map doindent (concat (lastMap (dtIL DTTopNode) (dtIL DTMidAboveNode) r))
|
||||
where
|
||||
doindent (a,b,c) = (a,b+1,c)
|
||||
|
||||
headMap :: (a -> b) -> (a -> b) -> [a] -> [b]
|
||||
headMap f g (x:xs) = f x : map g xs
|
||||
headMap _ _ [] = []
|
||||
|
||||
lastMap :: (a -> b) -> (a -> b) -> [a] -> [b]
|
||||
lastMap _ _ [] = []
|
||||
lastMap f _ (x:[]) = [f x]
|
||||
lastMap f g (x:xs) = g x : lastMap f g xs
|
||||
|
||||
Reference in New Issue
Block a user