Commit 68d6230a authored by Michael Hanus's avatar Michael Hanus
Browse files

tools updated

parent b0c4e678
...@@ -8,12 +8,13 @@ cpm/src/CPM/ConfigPackage.curry ...@@ -8,12 +8,13 @@ cpm/src/CPM/ConfigPackage.curry
*_CACHE *_CACHE
optimize/.cpm/packages/cass-2.0.0 optimize/.cpm/packages/cass-2.0.0
optimize/.cpm/packages/cass-analysis-2.0.0 optimize/.cpm/packages/cass-analysis-2.0.0
optimize/.cpm/packages/flatcurry-2.0.0
optimize/.cpm/packages/csv-1.0.0 optimize/.cpm/packages/csv-1.0.0
optimize/.cpm/packages/scc-0.0.1 optimize/.cpm/packages/currypath-0.0.1
optimize/.cpm/packages/xml-2.0.0 optimize/.cpm/packages/flatcurry-2.0.0
optimize/.cpm/packages/frontend-exec-0.0.1 optimize/.cpm/packages/frontend-exec-0.0.1
optimize/.cpm/packages/propertyfile-0.0.1 optimize/.cpm/packages/propertyfile-0.0.1
optimize/.cpm/packages/scc-0.0.1
optimize/.cpm/packages/xml-2.0.0
# executables # executables
cpm/src/CPM.Main cpm/src/CPM.Main
......
...@@ -12,8 +12,6 @@ module CPM.AbstractCurry ...@@ -12,8 +12,6 @@ module CPM.AbstractCurry
, applyModuleRenames , applyModuleRenames
) where ) where
import Distribution ( sysLibPath, inCurrySubdir, modNameToPath
, inCurrySubdirModule, lookupModuleSource )
import List ( intercalate, nub ) import List ( intercalate, nub )
import FilePath ( (</>), (<.>), takeFileName, replaceExtension ) import FilePath ( (</>), (<.>), takeFileName, replaceExtension )
import System import System
...@@ -23,6 +21,8 @@ import AbstractCurry.Pretty ( showCProg ) ...@@ -23,6 +21,8 @@ import AbstractCurry.Pretty ( showCProg )
import AbstractCurry.Select ( imports ) import AbstractCurry.Select ( imports )
import AbstractCurry.Transform import AbstractCurry.Transform
import AbstractCurry.Types import AbstractCurry.Types
import System.CurryPath ( sysLibPath, inCurrySubdir, modNameToPath
, inCurrySubdirModule, lookupModuleSource )
import System.FrontendExec ( FrontendTarget (..), FrontendParams (..) import System.FrontendExec ( FrontendTarget (..), FrontendParams (..)
, defaultParams, callFrontendWithParams , defaultParams, callFrontendWithParams
, setQuiet, setFullPath ) , setQuiet, setFullPath )
......
...@@ -20,10 +20,10 @@ import Function ( (***) ) ...@@ -20,10 +20,10 @@ import Function ( (***) )
import IOExts ( evalCmd ) import IOExts ( evalCmd )
import List ( split, splitOn, intersperse ) import List ( split, splitOn, intersperse )
import Maybe ( mapMaybe ) import Maybe ( mapMaybe )
import PropertyFile ( readPropertyFile )
import Read ( readInt ) import Read ( readInt )
import System.Path ( getFileInPath ) import Data.PropertyFile ( readPropertyFile )
import System.Path ( getFileInPath )
import CPM.ErrorLogger import CPM.ErrorLogger
import CPM.FileUtil ( ifFileExists ) import CPM.FileUtil ( ifFileExists )
......
...@@ -19,33 +19,33 @@ module CPM.Diff.Behavior ...@@ -19,33 +19,33 @@ module CPM.Diff.Behavior
, findFunctionsToCompare , findFunctionsToCompare
) where ) where
import Char ( isAlphaNum )
import Directory ( createDirectory, doesDirectoryExist, getTemporaryDirectory )
import FilePath ( (</>), joinPath )
import Function ( both )
import List ( intercalate, intersect, nub, splitOn, isPrefixOf, isInfixOf
, find, delete, (\\), nubBy )
import Maybe ( isJust, fromJust, fromMaybe, listToMaybe )
import System ( getEnviron, setEnviron, unsetEnviron )
import AbstractCurry.Build import AbstractCurry.Build
import AbstractCurry.Pretty ( defaultOptions, ppCTypeExpr, showCProg ) import AbstractCurry.Pretty ( defaultOptions, ppCTypeExpr, showCProg )
import AbstractCurry.Select ( publicFuncNames, funcName, functions, funcArity import AbstractCurry.Select ( publicFuncNames, funcName, functions, funcArity
, funcType, argTypes, typeName, types, tconsOfType , funcType, argTypes, typeName, types, tconsOfType
, resultType, isIOType, typeOfQualType ) , tconsArgsOfType, resultType, isIOType
, typeOfQualType )
import AbstractCurry.Transform (updCFuncDecl) import AbstractCurry.Transform (updCFuncDecl)
import AbstractCurry.Types ( CurryProg (..), CFuncDecl (..), CVisibility (..) import AbstractCurry.Types ( CurryProg (..), CFuncDecl (..), CVisibility (..)
, CTypeExpr (..), CPattern (..), CExpr (..) , CTypeExpr (..), CPattern (..), CExpr (..)
, CTypeDecl (..), CConsDecl (..), CFieldDecl (..) , CTypeDecl (..), CConsDecl (..), CFieldDecl (..)
, CVarIName, QName) , CVarIName, QName)
import Char (isAlphaNum)
import Directory (createDirectory, doesDirectoryExist, getTemporaryDirectory)
import Distribution (lookupModuleSource)
import FilePath ((</>), joinPath)
import Function (both)
import List ( intercalate, intersect, nub, splitOn, isPrefixOf, isInfixOf
, find, delete, (\\), nubBy )
import Maybe ( isJust, fromJust, fromMaybe, listToMaybe )
import System ( getEnviron, setEnviron, unsetEnviron )
import AbstractCurry.Select ( tconsArgsOfType )
import Analysis.Types ( Analysis ) import Analysis.Types ( Analysis )
import Analysis.ProgInfo ( ProgInfo, emptyProgInfo, combineProgInfo import Analysis.ProgInfo ( ProgInfo, emptyProgInfo, combineProgInfo
, lookupProgInfo) , lookupProgInfo)
import Analysis.Termination ( productivityAnalysis, Productivity(..) ) import Analysis.Termination ( productivityAnalysis, Productivity(..) )
import Analysis.TypeUsage ( typesInValuesAnalysis ) import Analysis.TypeUsage ( typesInValuesAnalysis )
import CASS.Server ( analyzeGeneric ) import CASS.Server ( analyzeGeneric )
import System.CurryPath ( lookupModuleSource )
import Text.Pretty ( pPrint, text, indent, vcat, (<+>), (<$$>) ) import Text.Pretty ( pPrint, text, indent, vcat, (<+>), (<$$>) )
import CPM.AbstractCurry ( readAbstractCurryFromDeps, loadPathForPackage ) import CPM.AbstractCurry ( readAbstractCurryFromDeps, loadPathForPackage )
......
...@@ -10,7 +10,7 @@ import Directory ( doesFileExist, getAbsolutePath, doesDirectoryExist ...@@ -10,7 +10,7 @@ import Directory ( doesFileExist, getAbsolutePath, doesDirectoryExist
, getCurrentDirectory, getDirectoryContents , getCurrentDirectory, getDirectoryContents
, getModificationTime , getModificationTime
, renameFile, removeFile, setCurrentDirectory ) , renameFile, removeFile, setCurrentDirectory )
import Distribution ( installDir, stripCurrySuffix, addCurrySubdir ) import Distribution ( installDir )
import Either import Either
import FilePath ( (</>), splitSearchPath, replaceExtension, takeExtension import FilePath ( (</>), splitSearchPath, replaceExtension, takeExtension
, pathSeparator, isPathSeparator ) , pathSeparator, isPathSeparator )
...@@ -22,10 +22,11 @@ import Sort ( sortBy ) ...@@ -22,10 +22,11 @@ import Sort ( sortBy )
import System ( getArgs, getEnviron, setEnviron, unsetEnviron, exitWith import System ( getArgs, getEnviron, setEnviron, unsetEnviron, exitWith
, system ) , system )
import Boxes ( table, render ) import Boxes ( table, render )
import OptParse import OptParse
import System.Path ( fileInPath ) import System.CurryPath ( addCurrySubdir, stripCurrySuffix )
import Text.CSV ( showCSV ) import System.Path ( fileInPath )
import Text.CSV ( showCSV )
import CPM.ErrorLogger import CPM.ErrorLogger
import CPM.FileUtil ( joinSearchPath, safeReadFile, whenFileExists import CPM.FileUtil ( joinSearchPath, safeReadFile, whenFileExists
...@@ -58,7 +59,7 @@ cpmBanner :: String ...@@ -58,7 +59,7 @@ cpmBanner :: String
cpmBanner = unlines [bannerLine,bannerText,bannerLine] cpmBanner = unlines [bannerLine,bannerText,bannerLine]
where where
bannerText = bannerText =
"Curry Package Manager <curry-language.org/tools/cpm> (version of 23/11/2018)" "Curry Package Manager <curry-language.org/tools/cpm> (version of 10/12/2018)"
bannerLine = take (length bannerText) (repeat '-') bannerLine = take (length bannerText) (repeat '-')
main :: IO () main :: IO ()
...@@ -1116,7 +1117,7 @@ linkCmd (LinkOptions src) cfg = ...@@ -1116,7 +1117,7 @@ linkCmd (LinkOptions src) cfg =
getLocalPackageSpec cfg "." |>= \specDir -> getLocalPackageSpec cfg "." |>= \specDir ->
cleanCurryPathCache specDir |> cleanCurryPathCache specDir |>
log Info ("Linking '" ++ src ++ "' into local package cache...") |> log Info ("Linking '" ++ src ++ "' into local package cache...") |>
linkToLocalCache src specDir linkToLocalCache cfg src specDir
--- `add` command: --- `add` command:
--- Option `--package`: copy the given package to the repository index --- Option `--package`: copy the given package to the repository index
......
...@@ -12,10 +12,10 @@ module CPM.Package.Helpers ...@@ -12,10 +12,10 @@ module CPM.Package.Helpers
) where ) where
import Directory import Directory
import Distribution ( addCurrySubdir )
import FilePath import FilePath
import List ( splitOn, nub ) import List ( splitOn, nub )
import System.CurryPath ( addCurrySubdir )
import Text.Pretty hiding ( (</>) ) import Text.Pretty hiding ( (</>) )
import CPM.Config ( Config, homePackageDir ) import CPM.Config ( Config, homePackageDir )
......
...@@ -138,15 +138,19 @@ installLocalDependenciesWithRepo cfg repo dir pkgSpec = ...@@ -138,15 +138,19 @@ installLocalDependenciesWithRepo cfg repo dir pkgSpec =
succeedIO (pkgSpec, cpkgs) succeedIO (pkgSpec, cpkgs)
--- Links a directory into the local package cache. Used for `cypm link`. --- Links a directory into the local package cache. Used for `cypm link`.
linkToLocalCache :: String -> String -> IO (ErrorLogger ()) linkToLocalCache :: Config -> String -> String -> IO (ErrorLogger ())
linkToLocalCache src pkgDir = do linkToLocalCache cfg src pkgDir = do
dirExists <- doesDirectoryExist src dirExists <- doesDirectoryExist src
if dirExists if dirExists
then loadPackageSpec src |>= \pkgSpec -> then loadPackageSpec src |>= \pkgSpec ->
LocalCache.createLink pkgDir src (packageId pkgSpec) True |> getPackageVersion cfg (name pkgSpec) (version pkgSpec) >>=
succeedIO () maybe
else log Critical ("Directory '" ++ src ++ "' does not exist.") |> (log Critical
succeedIO () ("Package '" ++ packageId pkgSpec ++ "' not in repository!\n" ++
"Note: you can only link copies of existing packages."))
(\_ -> LocalCache.createLink pkgDir src (packageId pkgSpec) True |>
succeedIO ())
else log Critical ("Directory '" ++ src ++ "' does not exist.")
--- Resolves the dependencies for a package copy and fills the package caches. --- Resolves the dependencies for a package copy and fills the package caches.
resolveAndCopyDependencies :: Config -> Repository -> GC.GlobalCache -> String resolveAndCopyDependencies :: Config -> Repository -> GC.GlobalCache -> String
......
...@@ -81,8 +81,9 @@ showConflict (ResolutionSuccess _ _) = "Resolution succeeded." ...@@ -81,8 +81,9 @@ showConflict (ResolutionSuccess _ _) = "Resolution succeeded."
showConflict (ResolutionFailure t) = case findRelevantConflict t of showConflict (ResolutionFailure t) = case findRelevantConflict t of
Just c -> showConflictState c Just c -> showConflictState c
Nothing -> case missingPackages $ clState $ findDeepestNode t of Nothing -> case missingPackages $ clState $ findDeepestNode t of
[] -> "Conflict resolution failed for an unknown reason :(\n" ++ [] -> "Conflict resolution failed for an unknown reason... Hint:(\n" ++
"Please clean your package ('cypm clean') and try again..." "Please clean your package ('cypm clean') and/or\n" ++
"your package index ('cypm update') and try again..."
(d@(Dependency p _):_) -> (d@(Dependency p _):_) ->
"There seems to be no version of package " ++ p ++ "There seems to be no version of package " ++ p ++
" that can satisfy the constraint " ++ showDependency d " that can satisfy the constraint " ++ showDependency d
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"licenseFile": "LICENSE", "licenseFile": "LICENSE",
"dependencies": { "dependencies": {
"base" : ">= 1.0.0, < 2.0.0",
"currypath" : ">= 0.0.1",
"frontend-exec" : ">= 0.0.1", "frontend-exec" : ">= 0.0.1",
"wl-pprint" : ">= 0.0.1" "wl-pprint" : ">= 0.0.1"
}, },
......
...@@ -7,19 +7,19 @@ ...@@ -7,19 +7,19 @@
--- extension `.acy` in the subdirectory `.curry` --- extension `.acy` in the subdirectory `.curry`
--- ---
--- @author Michael Hanus, Bjoern Peemoeller, Jan Tikovsky, Finn Teegen --- @author Michael Hanus, Bjoern Peemoeller, Jan Tikovsky, Finn Teegen
--- @version November 2018 --- @version December 2018
-- --------------------------------------------------------------------------- -- ---------------------------------------------------------------------------
module AbstractCurry.Files where module AbstractCurry.Files where
import Char ( isSpace ) import Char ( isSpace )
import Directory ( doesFileExist, getModificationTime ) import Directory ( doesFileExist, getModificationTime )
import Distribution ( getLoadPathForModule, inCurrySubdir
, lookupModuleSourceInLoadPath, stripCurrySuffix )
import FileGoodies ( getFileInPath, lookupFileInPath ) import FileGoodies ( getFileInPath, lookupFileInPath )
import FilePath ( takeFileName, (</>), (<.>) ) import FilePath ( takeFileName, (</>), (<.>) )
import ReadShowTerm import ReadShowTerm
import System.CurryPath ( getLoadPathForModule, inCurrySubdir
, lookupModuleSourceInLoadPath, stripCurrySuffix )
import System.FrontendExec import System.FrontendExec
import AbstractCurry.Select ( imports ) import AbstractCurry.Select ( imports )
......
...@@ -7,8 +7,10 @@ ...@@ -7,8 +7,10 @@
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"licenseFile": "LICENSE", "licenseFile": "LICENSE",
"dependencies": { "dependencies": {
"flatcurry": ">= 2.0.0", "base" : ">= 1.0.0, < 2.0.0",
"scc" : ">= 0.0.1" "currypath" : ">= 0.0.1",
"flatcurry" : ">= 2.0.0",
"scc" : ">= 0.0.1"
}, },
"compilerCompatibility": { "compilerCompatibility": {
"pakcs": ">= 2.0.0", "pakcs": ">= 2.0.0",
......
...@@ -3,23 +3,24 @@ ...@@ -3,23 +3,24 @@
--- persistently in files. --- persistently in files.
--- ---
--- @author Heiko Hoffmann, Michael Hanus --- @author Heiko Hoffmann, Michael Hanus
--- @version March 2017 --- @version December 2018
-------------------------------------------------------------------------- --------------------------------------------------------------------------
module Analysis.Files where module Analysis.Files where
import Directory import Directory
import Distribution ( installDir, lookupModuleSourceInLoadPath import Distribution ( installDir )
, stripCurrySuffix )
import FlatCurry.Files
import FlatCurry.Goodies (progImports)
import FlatCurry.Types (Prog, QName)
import FilePath import FilePath
import List (isPrefixOf, isSuffixOf) import List ( isPrefixOf, isSuffixOf )
import ReadShowTerm (readQTerm, showQTerm) import ReadShowTerm ( readQTerm, showQTerm )
import Time (ClockTime) import Time ( ClockTime )
import FlatCurry.Files
import FlatCurry.Goodies ( progImports )
import FlatCurry.Types ( Prog, QName )
import System.CurryPath ( lookupModuleSourceInLoadPath, stripCurrySuffix )
import Analysis.Logging (debugMessage) import Analysis.Logging ( debugMessage )
import Analysis.ProgInfo import Analysis.ProgInfo
......
--- Analyzing the residuation behavior of a module and returns
--- some statistical information.
import List ( intercalate, partition )
import FlatCurry.Types ( QName )
import CASS.Server ( analyzeGeneric )
import Analysis.ProgInfo ( progInfo2Lists )
import Analysis.Residuation -- ( demandAnalysis )
residuationInfoOf :: String
-> IO ([(QName,ResiduationInfo)],[(QName,ResiduationInfo)])
residuationInfoOf modname = do
analyzeGeneric residuationAnalysis modname
>>= return . either progInfo2Lists error
countResOps :: String -> IO [String]
countResOps mname = do
putStrLn $ "Analyzing module " ++ mname ++ "..."
(pubres,privres) <- residuationInfoOf mname
let (resops,nonresops) = partition (\(_,i) -> i==MayResiduate || i==NoResInfo)
(pubres ++ privres)
return [mname, show (length resops), show (length nonresops)]
printCountResOps :: [String] -> IO ()
printCountResOps mname = do
stats <- mapIO countResOps mname
putStrLn $ "Module | Residuating | Non-residuating"
mapIO_ (\row -> putStrLn (intercalate "|" row)) stats
main :: IO ()
main = printCountResOps baseModules
baseModules :: [String]
baseModules = ["Prelude","List","Char"]
allBaseModules :: [String]
allBaseModules =
["AllSolutions"
,"AnsiCodes"
,"Char"
,"Combinatorial"
,"CPNS"
,"Debug"
,"Dequeue"
,"Directory"
,"Distribution"
,"Either"
,"ErrorState"
,"FileGoodies"
,"FilePath"
,"Findall"
,"FiniteMap"
,"Float"
,"Format"
,"Function"
,"FunctionInversion"
,"GetOpt"
,"Global"
,"Integer"
,"IO"
,"IOExts"
,"List"
,"Maybe"
,"NamedSocket"
,"Nat"
,"Prelude"
,"Profile"
,"PropertyFile"
,"Random"
,"Read"
,"ReadNumeric"
,"ReadShowTerm"
,"RedBlackTree"
,"SearchTree"
,"SearchTreeGenerators"
,"SearchTreeTraversal"
,"SetFunctions"
,"SetRBT"
,"ShowS"
,"Socket"
,"Sort"
,"State"
,"System"
,"TableRBT"
,"Time"
,"Traversal"
,"Unsafe"
,"ValueSequence"
]
\ No newline at end of file
...@@ -7,10 +7,13 @@ ...@@ -7,10 +7,13 @@
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"licenseFile": "LICENSE", "licenseFile": "LICENSE",
"dependencies": { "dependencies": {
"cass-analysis": ">= 2.0.0", "base" : ">= 1.0.0, < 2.0.0",
"flatcurry" : ">= 2.0.0", "cass-analysis" : ">= 2.0.0",
"scc" : ">= 0.0.1", "currypath" : ">= 0.0.1",
"xml" : ">= 2.0.0" "flatcurry" : ">= 2.0.0",
"propertyfile" : ">= 0.0.1",
"scc" : ">= 0.0.1",
"xml" : ">= 2.0.0"
}, },
"compilerCompatibility": { "compilerCompatibility": {
"pakcs": ">= 2.0.0", "pakcs": ">= 2.0.0",
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
--- the analysis server (which is implicitly started if necessary). --- the analysis server (which is implicitly started if necessary).
--- ---
--- @author Michael Hanus --- @author Michael Hanus
--- @version September 2018 --- @version December 2018
-------------------------------------------------------------------------- --------------------------------------------------------------------------
module CASS.Configuration module CASS.Configuration
...@@ -17,19 +17,19 @@ module CASS.Configuration ...@@ -17,19 +17,19 @@ module CASS.Configuration
, getDefaultPath, waitTime, numberOfWorkers , getDefaultPath, waitTime, numberOfWorkers
) where ) where
import System import Char ( isSpace )
import Distribution (curryCompiler)
import PropertyFile
import ReadNumeric
import FilePath (FilePath, (</>), (<.>))
import Directory import Directory
import ReadShowTerm import Distribution ( curryCompiler )
import Sort (mergeSort) import FilePath ( FilePath, (</>), (<.>) )
import Global import Global
import Char (isSpace) import ReadNumeric
import ReadShowTerm
import Sort ( mergeSort )
import System
import Analysis.Logging (debugMessage, setDebugLevel) import Analysis.Logging ( debugMessage, setDebugLevel )
import CASS.PackageConfig (packagePath, packageExecutable, packageVersion) import CASS.PackageConfig ( packagePath, packageExecutable, packageVersion )
import Data.PropertyFile ( readPropertyFile, updatePropertyFile )
systemBanner :: String systemBanner :: String
systemBanner = systemBanner =
......
...@@ -2,28 +2,28 @@ ...@@ -2,28 +2,28 @@
--- This is the main module to start the executable of the analysis system. --- This is the main module to start the executable of the analysis system.
--- ---
--- @author Michael Hanus --- @author Michael Hanus
--- @version March 2017 --- @version December 2018
-------------------------------------------------------------------------- --------------------------------------------------------------------------
module CASS.Main(main) where module CASS.Main ( main ) where
import Char (toLower) import Char ( toLower )
import Distribution (stripCurrySuffix) import FilePath ( (</>), (<.>) )
import FilePath ((</>), (<.>))
import GetOpt import GetOpt
import List (isPrefixOf) import List ( isPrefixOf )
import ReadNumeric (readNat) import ReadNumeric ( readNat )
import ReadShowTerm (readQTerm) import ReadShowTerm ( readQTerm )
import Sort (sort) import Sort ( sort )
import System (exitWith,getArgs) import System ( exitWith, getArgs )
import Analysis.Files (deleteAllAnalysisFiles) import Analysis.Files ( deleteAllAnalysisFiles )
import Analysis.Logging (debugMessage) import Analysis.Logging ( debugMessage )
import CASS.Doc (getAnalysisDoc) import CASS.Doc ( getAnalysisDoc )
import CASS.Server import CASS.Server
import CASS.Configuration import CASS.Configuration
import CASS.Registry import CASS.Registry
import CASS.Worker (startWorker) import CASS.Worker ( startWorker )
import System.CurryPath ( stripCurrySuffix )
--- Main function to start the analysis system. --- Main function to start the analysis system.
--- With option -s or --server, the server is started on a socket. --- With option -s or --server, the server is started on a socket.
......
Copyright (c) 2018, Michael Hanus
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the names of the copyright holders nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
currypath
=========
This package provides the library `System.CurryPath` which contains
operations to deal with module names and paths used in a Curry system,