{-|
Module : MetaHS.DataModel.Utils.Name
Description : Utility functions for the MetaHS data model layer.
Copyright : Copyright (C) 2017-2019 H.H.R.F. Vos, S. Kamps
License : -- This file is distributed under the terms of the Apache License 2.0.
For more information, see the file "LICENSE", which is included in the distribution.
Stability : experimental
Name utility functions for the MetaHS data model layer.
-}
module MetaHS.DataModel.Utils.Name
( makeQualifiedId
, split
, isLocal
) where
import Data.List (intercalate, isSuffixOf, elemIndex)
import Data.List.Split (splitOn)
-- | Qualify identifier
makeQualifiedId :: String -- ^ The qualifier String (e.g. "MetaHS.DataModel.Extractor.Module.Source").
-> String -- ^ The local identifier String (e.g. "qn").
-> String -- ^ The resulting qualified String (e.g. "MetaHS.DataModel.Extractor.Module.Source.qn").
makeQualifiedId a b = a ++ "." ++ b
-- | Splits an identifier in the qualifier and name parts.
split :: String -- ^ The qualified String to split.
-> (String, String) -- ^ The qualified and name parts.
split qualName
| isSymbol = symbolSplit -- qualName contains a symbol as identified by the presence of an '(' character.
| unqualified = ("",qualName) -- qualName does not contain dots, therefore it is regarded as an unqualified name
| otherwise = (intercalate "." $ init dotParts, last dotParts) -- split qualName over the qualifier and the unqualified name
where
isSymbol = '(' `elem` qualName -- isSymbol is True is qualName contains an '(' character.
symbolSplit = case '(' `elemIndex` qualName of -- split function suitable for symbols.
Just n -> do
let (a,b) = splitAt n qualName
if "." `isSuffixOf` a
then (init a, b)
else (a,b)
Nothing -> ("","")
dotParts = splitOn "." qualName -- dotParts = splitted parts of qualName
unqualified = 1 == length dotParts -- unqualified is True is qualName does not contain dots
-- | Determines whether a given qualified name is local to the given qualifier.
isLocal :: String -- ^ The qualifier.
-> String -- ^ The qualified name.
-> Bool -- ^ True if the qualified name is local to the qualifier.
isLocal q qualName = (q ==) . fst $ split qualName