Tree datastructures: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Added direct parsing of a tree representation (to the Data.Tree variant)) |
m (→{{header|Haskell}}: Narrowed one type in the Data.Tree variant.) |
||
Line 460: | Line 460: | ||
import Data.List (find) |
import Data.List (find) |
||
import Data.Tree (Forest, Tree (..), drawTree) |
import Data.Tree (Forest, Tree (..), drawTree) |
||
-------- MAPPINGS BETWEEN INDENTED LINES AND TREES ------- |
-------- MAPPINGS BETWEEN INDENTED LINES AND TREES ------- |
||
forestFromNestLevels :: [(Int, |
forestFromNestLevels :: [(Int, String)] -> Forest String |
||
forestFromNestLevels = go |
forestFromNestLevels = go |
||
where |
where |
||
Line 470: | Line 470: | ||
uncurry (:) $ |
uncurry (:) $ |
||
bimap (Node v . go) go (span ((n <) . fst) xs) |
bimap (Node v . go) go (span ((n <) . fst) xs) |
||
indentLevelsFromLines :: [String] -> [(Int, String)] |
indentLevelsFromLines :: [String] -> [(Int, String)] |
||
indentLevelsFromLines xs = |
indentLevelsFromLines xs = |
||
Line 476: | Line 476: | ||
indentUnit = maybe 1 fst (find ((0 <) . fst) pairs) |
indentUnit = maybe 1 fst (find ((0 <) . fst) pairs) |
||
in first (`div` indentUnit) <$> pairs |
in first (`div` indentUnit) <$> pairs |
||
outlineFromForest :: |
outlineFromForest :: |
||
(String -> a -> String) -> |
(String -> a -> String) -> |
||
Line 487: | Line 487: | ||
(subForest node >>= go ((<>) tabString indent)) |
(subForest node >>= go ((<>) tabString indent)) |
||
in unlines $ forest >>= go "" |
in unlines $ forest >>= go "" |
||
-------------------------- TESTS ------------------------- |
-------------------------- TESTS ------------------------- |
||
main :: IO () |
main :: IO () |
||
Line 493: | Line 493: | ||
putStrLn "Tree representation parsed directly:\n" |
putStrLn "Tree representation parsed directly:\n" |
||
putStrLn $ drawTree $ Node "" nativeForest |
putStrLn $ drawTree $ Node "" nativeForest |
||
putStrLn "Trees from indented text:\n" |
putStrLn "Trees from indented text:\n" |
||
let trees = |
let trees = |
||
Line 499: | Line 499: | ||
indentLevelsFromLines test |
indentLevelsFromLines test |
||
putStrLn $ drawTree $ Node "" trees |
putStrLn $ drawTree $ Node "" trees |
||
putStrLn "Indented text from trees:\n" |
putStrLn "Indented text from trees:\n" |
||
putStrLn $ outlineFromForest (<>) " " trees |
putStrLn $ outlineFromForest (<>) " " trees |
||
test :: [String] |
test :: [String] |
||
test = |
test = |
||
Line 517: | Line 517: | ||
" irregular" |
" irregular" |
||
] |
] |
||
nativeForest :: Forest String |
nativeForest :: Forest String |
||
nativeForest = |
nativeForest = |