module HPath.Path
  ( Path(..)
  , parse
  , url
  ) where

import Data.List

import qualified Text.ParserCombinators.Parsec (parse)
import Text.ParserCombinators.Parsec hiding (parse)
import Text.ParserCombinators.Parsec.Char

import HPath.Parser.Lower




data Path                    =  Path [String] String String
deriving instance Eq Path
deriving instance Ord Path
deriving instance Show Path


parse                       ::  String -> Either ParseError Path
parse s = Text.ParserCombinators.Parsec.parse (qualified []) s s


qualified []                =  modules []
qualified (mod:mods)        =  do
  choice
    [ try (modules (mod:mods))
    , do
        name                <-  choice [varid, varsym, conid, consym]
        return (Path (reverse mods) mod name)
    ]


modules mods                 =  do
  mod                       <-  modid
  char '.'
  qualified (mod:mods)


url                         ::  Path -> String
url (Path h m d)             =  "hpath://" ++ intercalate "." (h ++ [m, d])