packages feed

WURFL-0.1: src/CreateTree.hs

module CreateTree  where

import qualified Data.Map as M
import Data.List
import WURFLTypes

test = [("CDM_8150",1),("CDM_8150_ver2",2),("CDM_8300",3),("d",4),("de",5),("def",6),("defg",7),("abcd",8),("abce",9)]
--test = [ ("CHTML Generic",1)
--       , ("Mozilla/5.0 (iPhone;",2)
--       ,("Nokia",3)
--       ,("Nokia 20",4)
--       ,("Nokia 30",5)
--       ]

--data MyTree a = MyNode String (Maybe a) [MyTree a] deriving(Show)

analyze :: [(String,a)] -> [Tree a]
analyze l = map asTree . M.toList . foldr addElem M.empty $ l
            
 where
  asTree :: (String,[(String,a)]) -> Tree a
  asTree (r,a:[]) = Node (r ++ fst a) (Just . snd $ a) []
  asTree (r,l) = let (children,node) = partition ((/=) "" . fst ) l in
      if length node == 1
      then
        Node r (Just . snd . head $ node) (analyze children)
      else
        Node r Nothing (analyze children)
  
  addElem :: (String,a) -> M.Map String [(String,a)] -> M.Map String [(String,a)]
  addElem (e,v) m = M.insertWith (++) (prefix e) [(tail e,v)] m 
              
  prefix :: String -> String
  prefix e = head e : ""
  
simplifyTree :: Tree a -> [Tree a]
simplifyTree (Node s a []) = [Node s a []]
simplifyTree (Node s a@(Just _) l) = [Node s a (concatMap simplifyTree l)]
simplifyTree (Node s Nothing (Node s' a l:[])) = simplifyTree $ Node (s++s') a l
simplifyTree (Node s Nothing l) =[Node s Nothing (concatMap simplifyTree l)]
--simplifyTree a = [a]

--main :: IO ()
--main = do
--  print . concatMap simplifyTree . analyze $ test