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, aString)] -> Forest aString
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 =
9,655

edits