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