summaryrefslogtreecommitdiff
path: root/source/Checking/Exact
diff options
context:
space:
mode:
authoradelon <22380201+adelon@users.noreply.github.com>2026-08-02 10:21:20 +0200
committeradelon <22380201+adelon@users.noreply.github.com>2026-08-02 10:21:20 +0200
commit357b0d5482a4d6817a4840d2ecdc0cce2b9c0474 (patch)
tree0d8b1ad4de83f806f1df949b777a4d6cf30760c2 /source/Checking/Exact
parente5961f2f7f9b06aed9deec4f1c534f07e8dd4184 (diff)
Authorize exact datatype families
Diffstat (limited to 'source/Checking/Exact')
-rw-r--r--source/Checking/Exact/Datatype.hs47
1 files changed, 47 insertions, 0 deletions
diff --git a/source/Checking/Exact/Datatype.hs b/source/Checking/Exact/Datatype.hs
index e10161d..8e0b907 100644
--- a/source/Checking/Exact/Datatype.hs
+++ b/source/Checking/Exact/Datatype.hs
@@ -14,6 +14,7 @@ module Checking.Exact.Datatype
, preparedExactDatatypeFactReference
, preparedExactDatatypeDescriptor
, prepareExactDatatype
+ , commitPreparedExactDatatype
, ExactDatatypeError(..)
, exactDatatypeErrorLocation
, renderExactDatatypeError
@@ -123,6 +124,52 @@ preparedExactDatatypeDescriptor
(PreparedExactDatatype _location _syntax _objects _facts descriptor) =
descriptor
+commitPreparedExactDatatype
+ :: PreparedExactDatatype
+ -> Declaration.ModuleDriver failure
+ ((), Declaration.CommittedDeclarationBatch)
+commitPreparedExactDatatype
+ (PreparedExactDatatype _location syntax objects facts descriptor) =
+ Declaration.commitCompiledDeclaration syntax do
+ traverse_ addObject objects
+ candidates <-
+ Declaration.reserveFrozenPropositionCandidateBatch
+ (fmap candidateInput facts)
+ let carrier :| constructors = fmap objectIdentity objects
+ Declaration.authorizeCompiledDeclaration
+ (Declaration.authorizeDatatypeCompilationCandidates
+ descriptor
+ carrier
+ (case constructors of
+ firstConstructor : remainingConstructors ->
+ firstConstructor :| remainingConstructors
+ [] ->
+ impossible
+ "a prepared datatype has no constructor")
+ candidates)
+ where
+ addObject
+ (PreparedDatatypeObject
+ _symbol key _coreType identity asserted) = do
+ traverse_ Declaration.addDeclarationObject asserted
+ Declaration.stageSemanticGlobalBinding
+ key
+ (GlobalReference identity)
+
+ candidateInput
+ (PreparedExactDatatypeFact marker target _reference) =
+ ( target
+ , SearchEligible
+ , [markerAlias marker]
+ )
+
+ markerAlias (Internal.Marker name) = semanticName name
+
+ objectIdentity
+ (PreparedDatatypeObject
+ _symbol _key _coreType identity _asserted) =
+ identity
+
data ExactDatatypeError
= ExactDatatypeUnsupportedBlock !Location
| ExactDatatypeOccurrenceCountMismatch !Location !Int !Int