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, a)] -> Forest a
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 =