LibName.hs revision 6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aed
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder{- |
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederModule : $Header$
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederDescription : library names for HetCASL and development graphs
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederCopyright : (c) Christian Maeder, DFKI GmbH 2008
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederMaintainer : Christian.Maeder@dfki.de
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederStability : provisional
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederPortability : portable
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederAbstract syntax of HetCASL specification libraries
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder-}
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maedermodule Common.LibName where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Doc
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.DocUtils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Id
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Keywords
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Utils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Data.List
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport System.Time
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs :: [Token]
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs = [genToken "OM"]
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian MaedermkQualName :: SIMPLE_ID -> LIB_ID -> Id -> Id
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian MaedermkQualName nodeId libId i =
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder Id omTs [i, simpleIdToId nodeId, libIdToId libId] $ posOfId i
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian MaederisQualNameFrom :: SIMPLE_ID -> LIB_ID -> Id -> Bool
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian MaederisQualNameFrom nodeId libId i@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ : n : l : _ | isQualName i ->
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder n == simpleIdToId nodeId && libIdToId libId == l
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> True
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName :: Id -> Bool
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName (Id ts cs _) = case cs of
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ : _ : _ -> ts == omTs
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ -> False
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst SchulzgetLibId :: Id -> Id
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst SchulzgetLibId j@(Id _ cs _) = case cs of
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz [_, _, i] | isQualName j -> i
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz | otherwise ->
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz error "Check by isQualName before calling getLibId!"
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz _ -> error "Check by isQualName before calling getLibId!"
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst SchulzgetNodeId :: Id -> Id
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst SchulzgetNodeId j@(Id _ cs _) = case cs of
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz [_, i, _] | isQualName j -> i
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz | otherwise ->
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz error "Check by isQualName before calling getNodeId!"
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz _ -> error "Check by isQualName before calling getNodeId!"
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName :: Id -> Id
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName j@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder i : _ | isQualName j -> i
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> j
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian MaederlibIdToId :: LIB_ID -> Id
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian MaederlibIdToId li = let
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder path = splitOn '/' $ show li
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder toTok s = Token s $ getRange li
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder in mkId $ map toTok $ intersperse "/" path
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederdata LIB_NAME = Lib_version
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder { getLIB_ID :: LIB_ID
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder , libVersion :: VERSION_NUMBER }
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder | Lib_id { getLIB_ID :: LIB_ID }
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederdata LIB_ID = Direct_link URL Range
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: start of URL
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder | Indirect_link PATH Range FilePath ClockTime
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: start of PATH
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaedernoTime :: ClockTime
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaedernoTime = TOD 0 0
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder-- | Returns the LIB_ID of a LIB_NAME
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaedergetModTime :: LIB_ID -> ClockTime
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaedergetModTime li = case li of
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link _ _ -> noTime
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link _ _ _ m -> m
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederupdFilePathOfLibId :: FilePath -> ClockTime -> LIB_ID -> LIB_ID
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederupdFilePathOfLibId fp mt li = case li of
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link _ _ -> li
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link p r _ _ -> Indirect_link p r fp mt
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederdata VERSION_NUMBER = Version_number [String] Range deriving (Show, Eq)
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: "version", start of first string
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz-- | the identifier of a specification, combining the specid and the libid
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulzdata SPEC_ID = SPEC_ID { specid :: Id,
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz libid :: Maybe LIB_ID }
6df66a8a7be47ca0d9a4d15b89d3380c8e1f4aedEwaryst Schulz
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maedertype URL = String
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maedertype PATH = String
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederinstance GetRange LIB_ID where
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder getRange li = case li of
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Direct_link _ r -> r
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Indirect_link _ r _ _ -> r
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Show LIB_ID where
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder show li = case li of
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Direct_link s _ -> s
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Indirect_link s1 _ _ _ -> s1
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Show LIB_NAME where
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder show ln = case ln of
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Lib_version li (Version_number vs _) ->
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder shows li $ " version " ++ intercalate "." vs
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder Lib_id li -> show li
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Eq LIB_ID where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link s1 _ == Direct_link s2 _ = s1 == s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link s1 _ _ _ == Indirect_link s2 _ _ _ = s1 == s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder _ == _ = False
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Ord LIB_ID where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link s1 _ <= Direct_link s2 _ = s1 <= s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link s1 _ _ _ <= Indirect_link s2 _ _ _ = s1 <= s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link _ _ <= _ = True
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link _ _ _ _ <= _ = False
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Eq LIB_NAME where
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Ord LIB_NAME where
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder compare ln1 ln2 = compare (getLIB_ID ln1) $ getLIB_ID ln2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Pretty LIB_NAME where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder pretty l = case l of
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Lib_version i v ->
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder fsep [pretty i, keyword versionS, pretty v]
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Lib_id i -> pretty i
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Pretty LIB_ID where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder pretty l = structId $ case l of
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Direct_link u _ -> u
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Indirect_link p _ _ _ -> p
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederinstance Pretty VERSION_NUMBER where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder pretty (Version_number aa _) =
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder hcat $ punctuate dot $ map codeToken aa