hledger/hledger-lib/Hledger/Utils/Tree.hs
2020-08-31 11:51:25 +10:00

27 lines
728 B
Haskell

module Hledger.Utils.Tree
( FastTree(..)
, treeFromPaths
) where
-- import Data.Char
import Data.List (foldl')
import qualified Data.Map as M
-- | An efficient-to-build tree suggested by Cale Gibbard, probably
-- better than accountNameTreeFrom.
newtype FastTree a = T (M.Map a (FastTree a))
deriving (Show, Eq, Ord)
emptyTree :: FastTree a
emptyTree = T M.empty
mergeTrees :: (Ord a) => FastTree a -> FastTree a -> FastTree a
mergeTrees (T m) (T m') = T (M.unionWith mergeTrees m m')
treeFromPath :: [a] -> FastTree a
treeFromPath [] = T M.empty
treeFromPath (x:xs) = T (M.singleton x (treeFromPath xs))
treeFromPaths :: (Ord a) => [[a]] -> FastTree a
treeFromPaths = foldl' mergeTrees emptyTree . map treeFromPath