-- | A model for Hydra namespaces and modules (collections of elements in the same namespace)

module Hydra.Module where

import qualified Hydra.Core as Core
import qualified Hydra.Graph as Graph
import Data.Int
import Data.List as L
import Data.Map as M
import Data.Set as S

newtype FileExtension = 
  FileExtension {
    FileExtension -> String
unFileExtension :: String}
  deriving (FileExtension -> FileExtension -> Bool
(FileExtension -> FileExtension -> Bool)
-> (FileExtension -> FileExtension -> Bool) -> Eq FileExtension
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FileExtension -> FileExtension -> Bool
== :: FileExtension -> FileExtension -> Bool
$c/= :: FileExtension -> FileExtension -> Bool
/= :: FileExtension -> FileExtension -> Bool
Eq, Eq FileExtension
Eq FileExtension =>
(FileExtension -> FileExtension -> Ordering)
-> (FileExtension -> FileExtension -> Bool)
-> (FileExtension -> FileExtension -> Bool)
-> (FileExtension -> FileExtension -> Bool)
-> (FileExtension -> FileExtension -> Bool)
-> (FileExtension -> FileExtension -> FileExtension)
-> (FileExtension -> FileExtension -> FileExtension)
-> Ord FileExtension
FileExtension -> FileExtension -> Bool
FileExtension -> FileExtension -> Ordering
FileExtension -> FileExtension -> FileExtension
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FileExtension -> FileExtension -> Ordering
compare :: FileExtension -> FileExtension -> Ordering
$c< :: FileExtension -> FileExtension -> Bool
< :: FileExtension -> FileExtension -> Bool
$c<= :: FileExtension -> FileExtension -> Bool
<= :: FileExtension -> FileExtension -> Bool
$c> :: FileExtension -> FileExtension -> Bool
> :: FileExtension -> FileExtension -> Bool
$c>= :: FileExtension -> FileExtension -> Bool
>= :: FileExtension -> FileExtension -> Bool
$cmax :: FileExtension -> FileExtension -> FileExtension
max :: FileExtension -> FileExtension -> FileExtension
$cmin :: FileExtension -> FileExtension -> FileExtension
min :: FileExtension -> FileExtension -> FileExtension
Ord, ReadPrec [FileExtension]
ReadPrec FileExtension
Int -> ReadS FileExtension
ReadS [FileExtension]
(Int -> ReadS FileExtension)
-> ReadS [FileExtension]
-> ReadPrec FileExtension
-> ReadPrec [FileExtension]
-> Read FileExtension
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS FileExtension
readsPrec :: Int -> ReadS FileExtension
$creadList :: ReadS [FileExtension]
readList :: ReadS [FileExtension]
$creadPrec :: ReadPrec FileExtension
readPrec :: ReadPrec FileExtension
$creadListPrec :: ReadPrec [FileExtension]
readListPrec :: ReadPrec [FileExtension]
Read, Int -> FileExtension -> String -> String
[FileExtension] -> String -> String
FileExtension -> String
(Int -> FileExtension -> String -> String)
-> (FileExtension -> String)
-> ([FileExtension] -> String -> String)
-> Show FileExtension
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> FileExtension -> String -> String
showsPrec :: Int -> FileExtension -> String -> String
$cshow :: FileExtension -> String
show :: FileExtension -> String
$cshowList :: [FileExtension] -> String -> String
showList :: [FileExtension] -> String -> String
Show)

_FileExtension :: Name
_FileExtension = (String -> Name
Core.Name String
"hydra/module.FileExtension")

-- | A library of primitive functions
data Library = 
  Library {
    -- | A common prefix for all primitive function names in the library
    Library -> Namespace
libraryNamespace :: Namespace,
    -- | A preferred namespace prefix for function names in the library
    Library -> String
libraryPrefix :: String,
    -- | The primitives defined in this library
    Library -> [Primitive]
libraryPrimitives :: [Graph.Primitive]}

_Library :: Name
_Library = (String -> Name
Core.Name String
"hydra/module.Library")

_Library_namespace :: Name
_Library_namespace = (String -> Name
Core.Name String
"namespace")

_Library_prefix :: Name
_Library_prefix = (String -> Name
Core.Name String
"prefix")

_Library_primitives :: Name
_Library_primitives = (String -> Name
Core.Name String
"primitives")

-- | A logical collection of elements in the same namespace, having dependencies on zero or more other modules
data Module = 
  Module {
    -- | A common prefix for all element names in the module
    Module -> Namespace
moduleNamespace :: Namespace,
    -- | The elements defined in this module
    Module -> [Element]
moduleElements :: [Graph.Element],
    -- | Any modules which the term expressions of this module directly depend upon
    Module -> [Module]
moduleTermDependencies :: [Module],
    -- | Any modules which the type expressions of this module directly depend upon
    Module -> [Module]
moduleTypeDependencies :: [Module],
    -- | An optional human-readable description of the module
    Module -> Maybe String
moduleDescription :: (Maybe String)}
  deriving (Module -> Module -> Bool
(Module -> Module -> Bool)
-> (Module -> Module -> Bool) -> Eq Module
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Module -> Module -> Bool
== :: Module -> Module -> Bool
$c/= :: Module -> Module -> Bool
/= :: Module -> Module -> Bool
Eq, Eq Module
Eq Module =>
(Module -> Module -> Ordering)
-> (Module -> Module -> Bool)
-> (Module -> Module -> Bool)
-> (Module -> Module -> Bool)
-> (Module -> Module -> Bool)
-> (Module -> Module -> Module)
-> (Module -> Module -> Module)
-> Ord Module
Module -> Module -> Bool
Module -> Module -> Ordering
Module -> Module -> Module
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Module -> Module -> Ordering
compare :: Module -> Module -> Ordering
$c< :: Module -> Module -> Bool
< :: Module -> Module -> Bool
$c<= :: Module -> Module -> Bool
<= :: Module -> Module -> Bool
$c> :: Module -> Module -> Bool
> :: Module -> Module -> Bool
$c>= :: Module -> Module -> Bool
>= :: Module -> Module -> Bool
$cmax :: Module -> Module -> Module
max :: Module -> Module -> Module
$cmin :: Module -> Module -> Module
min :: Module -> Module -> Module
Ord, ReadPrec [Module]
ReadPrec Module
Int -> ReadS Module
ReadS [Module]
(Int -> ReadS Module)
-> ReadS [Module]
-> ReadPrec Module
-> ReadPrec [Module]
-> Read Module
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Module
readsPrec :: Int -> ReadS Module
$creadList :: ReadS [Module]
readList :: ReadS [Module]
$creadPrec :: ReadPrec Module
readPrec :: ReadPrec Module
$creadListPrec :: ReadPrec [Module]
readListPrec :: ReadPrec [Module]
Read, Int -> Module -> String -> String
[Module] -> String -> String
Module -> String
(Int -> Module -> String -> String)
-> (Module -> String)
-> ([Module] -> String -> String)
-> Show Module
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Module -> String -> String
showsPrec :: Int -> Module -> String -> String
$cshow :: Module -> String
show :: Module -> String
$cshowList :: [Module] -> String -> String
showList :: [Module] -> String -> String
Show)

_Module :: Name
_Module = (String -> Name
Core.Name String
"hydra/module.Module")

_Module_namespace :: Name
_Module_namespace = (String -> Name
Core.Name String
"namespace")

_Module_elements :: Name
_Module_elements = (String -> Name
Core.Name String
"elements")

_Module_termDependencies :: Name
_Module_termDependencies = (String -> Name
Core.Name String
"termDependencies")

_Module_typeDependencies :: Name
_Module_typeDependencies = (String -> Name
Core.Name String
"typeDependencies")

_Module_description :: Name
_Module_description = (String -> Name
Core.Name String
"description")

-- | A prefix for element names
newtype Namespace = 
  Namespace {
    Namespace -> String
unNamespace :: String}
  deriving (Namespace -> Namespace -> Bool
(Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Bool) -> Eq Namespace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Namespace -> Namespace -> Bool
== :: Namespace -> Namespace -> Bool
$c/= :: Namespace -> Namespace -> Bool
/= :: Namespace -> Namespace -> Bool
Eq, Eq Namespace
Eq Namespace =>
(Namespace -> Namespace -> Ordering)
-> (Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Namespace)
-> (Namespace -> Namespace -> Namespace)
-> Ord Namespace
Namespace -> Namespace -> Bool
Namespace -> Namespace -> Ordering
Namespace -> Namespace -> Namespace
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Namespace -> Namespace -> Ordering
compare :: Namespace -> Namespace -> Ordering
$c< :: Namespace -> Namespace -> Bool
< :: Namespace -> Namespace -> Bool
$c<= :: Namespace -> Namespace -> Bool
<= :: Namespace -> Namespace -> Bool
$c> :: Namespace -> Namespace -> Bool
> :: Namespace -> Namespace -> Bool
$c>= :: Namespace -> Namespace -> Bool
>= :: Namespace -> Namespace -> Bool
$cmax :: Namespace -> Namespace -> Namespace
max :: Namespace -> Namespace -> Namespace
$cmin :: Namespace -> Namespace -> Namespace
min :: Namespace -> Namespace -> Namespace
Ord, ReadPrec [Namespace]
ReadPrec Namespace
Int -> ReadS Namespace
ReadS [Namespace]
(Int -> ReadS Namespace)
-> ReadS [Namespace]
-> ReadPrec Namespace
-> ReadPrec [Namespace]
-> Read Namespace
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Namespace
readsPrec :: Int -> ReadS Namespace
$creadList :: ReadS [Namespace]
readList :: ReadS [Namespace]
$creadPrec :: ReadPrec Namespace
readPrec :: ReadPrec Namespace
$creadListPrec :: ReadPrec [Namespace]
readListPrec :: ReadPrec [Namespace]
Read, Int -> Namespace -> String -> String
[Namespace] -> String -> String
Namespace -> String
(Int -> Namespace -> String -> String)
-> (Namespace -> String)
-> ([Namespace] -> String -> String)
-> Show Namespace
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Namespace -> String -> String
showsPrec :: Int -> Namespace -> String -> String
$cshow :: Namespace -> String
show :: Namespace -> String
$cshowList :: [Namespace] -> String -> String
showList :: [Namespace] -> String -> String
Show)

_Namespace :: Name
_Namespace = (String -> Name
Core.Name String
"hydra/module.Namespace")

-- | A qualified name consisting of an optional namespace together with a mandatory local name
data QualifiedName = 
  QualifiedName {
    QualifiedName -> Maybe Namespace
qualifiedNameNamespace :: (Maybe Namespace),
    QualifiedName -> String
qualifiedNameLocal :: String}
  deriving (QualifiedName -> QualifiedName -> Bool
(QualifiedName -> QualifiedName -> Bool)
-> (QualifiedName -> QualifiedName -> Bool) -> Eq QualifiedName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: QualifiedName -> QualifiedName -> Bool
== :: QualifiedName -> QualifiedName -> Bool
$c/= :: QualifiedName -> QualifiedName -> Bool
/= :: QualifiedName -> QualifiedName -> Bool
Eq, Eq QualifiedName
Eq QualifiedName =>
(QualifiedName -> QualifiedName -> Ordering)
-> (QualifiedName -> QualifiedName -> Bool)
-> (QualifiedName -> QualifiedName -> Bool)
-> (QualifiedName -> QualifiedName -> Bool)
-> (QualifiedName -> QualifiedName -> Bool)
-> (QualifiedName -> QualifiedName -> QualifiedName)
-> (QualifiedName -> QualifiedName -> QualifiedName)
-> Ord QualifiedName
QualifiedName -> QualifiedName -> Bool
QualifiedName -> QualifiedName -> Ordering
QualifiedName -> QualifiedName -> QualifiedName
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: QualifiedName -> QualifiedName -> Ordering
compare :: QualifiedName -> QualifiedName -> Ordering
$c< :: QualifiedName -> QualifiedName -> Bool
< :: QualifiedName -> QualifiedName -> Bool
$c<= :: QualifiedName -> QualifiedName -> Bool
<= :: QualifiedName -> QualifiedName -> Bool
$c> :: QualifiedName -> QualifiedName -> Bool
> :: QualifiedName -> QualifiedName -> Bool
$c>= :: QualifiedName -> QualifiedName -> Bool
>= :: QualifiedName -> QualifiedName -> Bool
$cmax :: QualifiedName -> QualifiedName -> QualifiedName
max :: QualifiedName -> QualifiedName -> QualifiedName
$cmin :: QualifiedName -> QualifiedName -> QualifiedName
min :: QualifiedName -> QualifiedName -> QualifiedName
Ord, ReadPrec [QualifiedName]
ReadPrec QualifiedName
Int -> ReadS QualifiedName
ReadS [QualifiedName]
(Int -> ReadS QualifiedName)
-> ReadS [QualifiedName]
-> ReadPrec QualifiedName
-> ReadPrec [QualifiedName]
-> Read QualifiedName
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS QualifiedName
readsPrec :: Int -> ReadS QualifiedName
$creadList :: ReadS [QualifiedName]
readList :: ReadS [QualifiedName]
$creadPrec :: ReadPrec QualifiedName
readPrec :: ReadPrec QualifiedName
$creadListPrec :: ReadPrec [QualifiedName]
readListPrec :: ReadPrec [QualifiedName]
Read, Int -> QualifiedName -> String -> String
[QualifiedName] -> String -> String
QualifiedName -> String
(Int -> QualifiedName -> String -> String)
-> (QualifiedName -> String)
-> ([QualifiedName] -> String -> String)
-> Show QualifiedName
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> QualifiedName -> String -> String
showsPrec :: Int -> QualifiedName -> String -> String
$cshow :: QualifiedName -> String
show :: QualifiedName -> String
$cshowList :: [QualifiedName] -> String -> String
showList :: [QualifiedName] -> String -> String
Show)

_QualifiedName :: Name
_QualifiedName = (String -> Name
Core.Name String
"hydra/module.QualifiedName")

_QualifiedName_namespace :: Name
_QualifiedName_namespace = (String -> Name
Core.Name String
"namespace")

_QualifiedName_local :: Name
_QualifiedName_local = (String -> Name
Core.Name String
"local")