Tree datastructures: Difference between revisions

m
→‎{{header|Haskell}}: Added output of [(Int, String] list to Data.Tree variant.
m (→‎{{header|Haskell}}: Narrowed one type in the Data.Tree variant.)
m (→‎{{header|Haskell}}: Added output of [(Int, String] list to Data.Tree variant.)
Line 460:
import Data.List (find)
import Data.Tree (Forest, Tree (..), drawTree)
 
-------- MAPPINGS BETWEEN INDENTED LINES AND TREES -------
 
forestFromNestLevels :: [(Int, String)] -> Forest String
forestFromNestLevels = go
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
 
let levelPairs = indentLevelsFromLines test
putStrLn "Trees from indented text:\n"
putStrLn "\n[(Level, Text)] list from lines:\n"
mapM_ print levelPairs
 
putStrLn "Trees\n\nTrees from indented text:\n"
let trees =
forestFromNestLevels $
indentLevelsFromLines testlevelPairs
putStrLn $ drawTree $ Node "" trees
 
putStrLn "Indented text from trees:\n"
putStrLn $ outlineFromForest (<>) " " trees
 
test :: [String]
test =
Line 517 ⟶ 521:
" irregular"
]
 
nativeForest :: Forest String
nativeForest =
Line 588 ⟶ 592:
|
`- irregular
 
 
[(Level, Text)] list from lines:
 
(0,"RosettaCode")
(1,"rocks")
(2,"code")
(2,"comparison")
(2,"wiki")
(1,"mocks")
(2,"trolling")
(0,"Some lists")
(3,"may")
(2,"be")
(1,"irregular")
 
 
Trees from indented text:
9,659

edits