hydra-kernel-0.16.1: src/main/haskell/Hydra/Dsl/Bootstrap.hs
-- | A bootstrapping DSL, used for Hydra's inner core models
module Hydra.Dsl.Bootstrap (
module Hydra.Dsl.AsType,
bootstrapGraph,
datatype,
descriptionMetadata,
qualify,
qualifiedDep,
typeref,
defineType,
unqualifiedDep,
) where
import Hydra.Util
import Hydra.Constants
import Hydra.Core
import Hydra.Dsl.AsType
import Hydra.Graph
import Hydra.Lexical
import Hydra.Annotations
import Hydra.Packaging
import Hydra.Dsl.Libraries
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S
-- | An empty graph (no elements, no schema, but with primitive functions) which is used for bootstrapping Hydra Core
bootstrapGraph :: Graph
bootstrapGraph = Graph {
graphBoundTerms = M.empty,
graphBoundTypes = M.empty,
graphClassConstraints = M.empty,
graphLambdaVariables = S.empty,
graphMetadata = M.empty,
graphPrimitives = M.fromList $ fmap (\p -> (primitiveDefinitionName (primitiveDefinition p), p)) (L.concat (libraryPrimitives <$> standardLibraries)),
graphSchemaTypes = M.empty,
graphTypeVariables = S.empty}
-- | Define a type in a namespace, producing a TypeDefinition directly.
datatype :: ModuleName -> String -> Type -> TypeDefinition
datatype gname lname typ = TypeDefinition {
typeDefinitionName = qualify gname (Name lname),
typeDefinitionMetadata = Nothing,
typeDefinitionBody = TypeScheme {
typeSchemeVariables = [],
typeSchemeBody = typ,
typeSchemeConstraints = Nothing}}
-- | Define a type in a namespace
defineType :: ModuleName -> String -> Type -> TypeDefinition
defineType = datatype
-- | A module dependency qualified by the providing package, for disambiguation.
-- Not yet used, but retained for forthcoming package-qualified dependency resolution.
qualifiedDep :: PackageName -> ModuleName -> ModuleDependency
qualifiedDep pkg ns = ModuleDependency ns (Just pkg)
qualify :: ModuleName -> Name -> Name
qualify (ModuleName gname) (Name lname) = Name $ gname ++ "." ++ lname
typeref :: ModuleName -> String -> Type
typeref ns = TypeVariable . qualify ns . Name
-- | An unqualified module dependency (package omitted; resolver searches all packages in scope)
unqualifiedDep :: ModuleName -> ModuleDependency
unqualifiedDep ns = ModuleDependency ns Nothing
-- | Wrap an optional description string as entity metadata carrying only that description.
-- Used to migrate the former Module/Package `description` field into the `metadata` field
-- without data loss; a Nothing description yields no metadata.
descriptionMetadata :: Maybe String -> Maybe EntityMetadata
descriptionMetadata Nothing = Nothing
descriptionMetadata desc = Just (EntityMetadata desc [] [] Nothing)