tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

44b76074bc8d2d8015cf54a2e756c674d2caaeab9628e0d34859f6a0c342243a.tri (23607B)


      1 !import prelude *
      2 !import io *
      3 !import source_object *
      4 !import source_unit *
      5 !import source_resolve *
      6 !import source_lexer *
      7 !import parser *
      8 !export *
      9 
     10 -- Initial executable-only Arboricx manifest: exact existing Haskell v1
     11 -- encoding with no contract fields. A row is name -> whole tree-term object.
     12 sourceModuleHeader = "arboricx.module-manifest.v1\n"
     13 sourceModuleEscapeByte byte =
     14   matchBool "%25"
     15     (matchBool "%09"
     16       (matchBool "%0A" (matchBool "%0D" (pair byte t)
     17         (equal? byte 13)) (equal? byte 10)) (equal? byte 9))
     18     (equal? byte 37)
     19 sourceModuleEscape_ self bytes =
     20   lazyList
     21     (_ : t)
     22     (byte rest : append (sourceModuleEscapeByte byte) (self rest))
     23     bytes
     24 sourceModuleEscape bytes = y sourceModuleEscape_ bytes
     25 sourceModuleUnescapeCode a b =
     26   matchBool (ok 37 t)
     27     (matchBool (ok 9 t)
     28       (matchBool (ok 10 t) (matchBool (ok 13 t)
     29         (err "invalid manifest escape" t)
     30         (and? (equal? a 48) (equal? b 68)))
     31         (and? (equal? a 48) (equal? b 65)))
     32       (and? (equal? a 48) (equal? b 57)))
     33     (and? (equal? a 50) (equal? b 53))
     34 sourceModuleUnescape_ self bytes =
     35   lazyList
     36     (_ : ok t t)
     37     (byte rest : lazyBool
     38       (_ : lazyList
     39         (_ : err "truncated manifest escape" t)
     40         (a tail : lazyList
     41           (_ : err "truncated manifest escape" t)
     42           (b remaining : lazyResult
     43             (problem unused : err problem t)
     44             (decoded unused : lazyResult
     45               (problem unused : err problem t)
     46               (suffix unused : ok (pair decoded suffix) t)
     47               (self remaining))
     48             (sourceModuleUnescapeCode a b))
     49           tail)
     50         rest)
     51       (_ : lazyResult
     52         (problem unused : err problem t)
     53         (suffix unused : ok (pair byte suffix) t)
     54         (self rest))
     55       (equal? byte 37))
     56     bytes
     57 sourceModuleUnescape bytes = y sourceModuleUnescape_ bytes
     58 sourceModuleRow name hash =
     59   append "export\t" (append (sourceModuleEscape name)
     60     (append "\tarboricx.tree-term.v1\t"
     61       (append hash "\tarboricx.abi.tree.v1\n")))
     62 sourceModuleEncode_ self entries =
     63   lazyList
     64     (_ : t)
     65     (entry rest : append (sourceModuleRow (fst entry) (snd entry)) (self rest))
     66     entries
     67 sourceModuleEncode entries =
     68   append sourceModuleHeader (y sourceModuleEncode_ entries)
     69 
     70 -- Reject malformed/unrecognized rows and duplicate names. Re-encoding
     71 -- validates exact canonical bytes, including trailing newline and row order.
     72 sourceModuleRows_ self rows seen =
     73   lazyList
     74     (_ : ok (reverse seen) t)
     75     (row rest :
     76       lazyList
     77         (_ : lazyList
     78           (_ : ok (reverse seen) t)
     79           (_ _ : err "blank manifest row" t)
     80           rest)
     81         (_ _ : sourceModuleRowParse row rest seen self)
     82         row)
     83     rows
     84 sourceModuleRowParse row rest seen self =
     85   lazyList
     86     (_ : err "invalid module manifest row" t)
     87     (a tail1 : lazyList
     88       (_ : err "invalid module manifest row" t)
     89       (encodedName tail2 : lazyResult
     90         (problem unused : err problem t)
     91         (name unused : lazyList
     92         (_ : err "invalid module manifest row" t)
     93         (kind tail3 : lazyList
     94           (_ : err "invalid module manifest row" t)
     95           (hash tail4 : lazyList
     96             (_ : err "invalid module manifest row" t)
     97             (abi extra : lazyBool
     98               (_ : lazyBool
     99                 (_ : lazyBool
    100                   (_ : lazyBool
    101                     (_ : lazyMaybe
    102                       (_ : self rest (pair (pair name hash) seen))
    103                       (_ : err "duplicate module export" t)
    104                       (sourceFindExternal seen name))
    105                     (_ : err "unsupported export ABI" t)
    106                     (equal? abi sourceObjectTreeAbi))
    107                   (_ : err "unsupported export kind" t)
    108                   (equal? kind sourceObjectTreeKind))
    109                 (_ : err "invalid export name or digest" t)
    110                 (and? (sourceModuleExportNameValid name)
    111                   (sourceModuleDigest? hash)))
    112               (_ : err "invalid module manifest row" t)
    113               (emptyList? extra))
    114             tail4)
    115           tail3)
    116         tail2)
    117         (sourceModuleUnescape encodedName))
    118       tail1)
    119     (splitOnByte 9 row)
    120 -- Keep parser dependencies below the recursive worker, not in a top-level y.
    121 sourceModuleDecode bytes =
    122   lazyList
    123     (_ : err "empty module manifest" t)
    124     (header rows : lazyBool
    125       (_ : lazyResult
    126         (problem remaining : err problem remaining)
    127         (exports remaining : lazyBool
    128           (_ : ok exports t)
    129           (_ : err "noncanonical module manifest" t)
    130           (equal? bytes (sourceModuleEncode exports)))
    131         (y sourceModuleRows_ rows t))
    132       (_ : err "unsupported module manifest version" t)
    133       (equal? header "arboricx.module-manifest.v1"))
    134     (splitOnByte 10 bytes)
    135 
    136 sourceModuleEntriesValid_ self entries seen =
    137   lazyList
    138     (_ : true)
    139     (entry rest : andLazy?
    140       (and? (sourceModuleExportNameValid (fst entry))
    141         (and? (sourceModuleDigest? (snd entry))
    142           (lazyMaybe true (_ : false)
    143             (sourceFindExternal seen (fst entry)))))
    144       (_ : self rest (pair entry seen)))
    145     entries
    146 sourceModulePutManifest root entries =
    147   lazyList
    148     (_ : pure (err "module requires an export" t))
    149     (_ _ : lazyBool
    150       (_ : sourceObjectStore root sourceObjectManifestDomain
    151         (sourceModuleEncode entries))
    152       (_ : pure (err "invalid or duplicate module export" t))
    153       (y sourceModuleEntriesValid_ entries t))
    154     entries
    155 sourceModuleGetManifest root hash =
    156   onResult_ (sourceObjectGet root sourceObjectManifestDomain hash)
    157     (problem : pure (err problem t))
    158     (payload : pure (sourceModuleDecode payload))
    159 
    160 -- Workspace module aliases use the pre-existing neutral alias file format.
    161 -- A consuming source may instead put the full immutable manifest hash here.
    162 -- A v1 name containing '%' must be escaped by the Haskell codec. This
    163 -- bounded producer accepts unescaped ASCII identifiers only.
    164 sourceModuleExportChar? byte = sourceNameContinue? byte
    165 sourceModuleExportNameRest_ self name =
    166   lazyList
    167     (_ : true)
    168     (byte rest : andLazy? (sourceModuleExportChar? byte)
    169       (_ : self rest))
    170     name
    171 sourceModuleExportNameValid name =
    172   lazyList
    173     (_ : false)
    174     (first rest : andLazy? (sourceNameStart? first)
    175       (_ : y sourceModuleExportNameRest_ rest))
    176     name
    177 
    178 sourceModuleAliasByte? byte =
    179   or? (sourceAsciiLetter? byte)
    180     (or? (sourceAsciiDigit? byte)
    181       (or? (equal? byte 95) (equal? byte 45)))
    182 sourceModuleAliasValid_ self bytes =
    183   lazyList
    184     (_ : true)
    185     (byte rest : andLazy? (sourceModuleAliasByte? byte)
    186       (_ : self rest))
    187     bytes
    188 sourceModuleAliasValid alias =
    189   lazyList
    190     (_ : false)
    191     (first rest : andLazy? (sourceNameStart? first)
    192       (_ : y sourceModuleAliasValid_ rest))
    193     alias
    194 sourceModuleDigest? bytes = sourceObjectHashValid bytes
    195 sourceModuleAliasPath root alias =
    196   append root (append "/aliases/modules/" alias)
    197 sourceModuleAliasBytes hash =
    198   append "kind: arboricx.module-manifest.v1\nhash: "
    199     (append hash "\n")
    200 sourceModuleResolveAlias root alias =
    201   lazyBool
    202     (_ : onResult_ (readFile (sourceModuleAliasPath root alias))
    203       (problem : pure (err problem t))
    204       (bytes : sourceModuleParseAlias bytes))
    205     (_ : pure (err "invalid module alias" t))
    206     (sourceModuleAliasValid alias)
    207 sourceModuleParseAlias bytes =
    208   lazyList
    209     (_ : pure (err "invalid module alias" t))
    210     (kind rest : lazyList
    211       (_ : pure (err "invalid module alias" t))
    212       (line trailing : lazyBool
    213         (_ : sourceModuleParseAliasHash bytes line)
    214         (_ : pure (err "invalid module alias" t))
    215         (equal? kind "kind: arboricx.module-manifest.v1"))
    216       rest)
    217     (splitOnByte 10 bytes)
    218 sourceModuleParseAliasHash bytes line =
    219   lazyList
    220     (_ : pure (err "invalid module alias" t))
    221     (key tail : lazyList
    222       (_ : pure (err "invalid module alias" t))
    223       (hash extra : lazyBool
    224         (_ : lazyBool
    225           (_ : pure (ok hash t))
    226           (_ : pure (err "noncanonical module alias" t))
    227           (equal? bytes (sourceModuleAliasBytes hash)))
    228         (_ : pure (err "invalid module alias hash" t))
    229         (and? (equal? key "hash:")
    230           (and? (emptyList? extra) (sourceModuleDigest? hash))))
    231       tail)
    232     (splitOnByte 32 line)
    233 sourceModuleResolveRef root ref =
    234   lazyBool
    235     (_ : pure (ok ref t))
    236     (_ : sourceModuleResolveAlias root ref)
    237     (sourceModuleDigest? ref)
    238 sourceModulePinAlias root alias hash =
    239   lazyBool
    240     (_ : lazyBool
    241       (_ : onOk_ (sourceModuleGetManifest root hash) (_ :
    242         onOk_ (createDirectory (append root "/aliases")) (_ :
    243           onOk_ (createDirectory (append root "/aliases/modules")) (_ :
    244             onOk_ (atomicWriteBytes (sourceModuleAliasPath root alias)
    245               (sourceModuleAliasBytes hash)) (_ : pure (ok t t))))))
    246       (_ : pure (err "invalid manifest digest" t))
    247       (sourceModuleDigest? hash))
    248     (_ : pure (err "invalid module alias" t))
    249     (sourceModuleAliasValid alias)
    250 sourceModuleGetRefManifest root ref =
    251   onResult_ (sourceModuleResolveRef root ref)
    252     (problem : pure (err problem t))
    253     (hash : sourceModuleGetManifest root hash)
    254 
    255 -- Only selected exports hydrate; an unrelated changed tree is never loaded.
    256 sourceModuleLoadSelected root manifestHash name =
    257   onResult_ (sourceModuleGetRefManifest root manifestHash)
    258     (problem : pure (err problem t))
    259     (exports : lazyMaybe
    260       (_ : pure (err "missing module export" t))
    261       (hash : sourceObjectGetTree root hash)
    262       (sourceFindExternal exports name))
    263 
    264 -- Compile a definitions-only source with explicitly resolved external trees.
    265 -- Put every declared local export as an independent canonical tree-term.
    266 -- Public IO builder: environment and export selection are explicit data;
    267 -- no old !import resolver participates at runtime.
    268 sourceModulePublish root environment source names =
    269   lazyResult
    270     (diagnostic unused : pure (err diagnostic t))
    271     (definitions unused : sourceModulePublishNames root definitions names)
    272     (compileModuleDefinitions environment source)
    273 sourceModulePublishNames root definitions names =
    274   y sourceModulePublishNames_ names root definitions t
    275 sourceModulePublishNames_ self names root definitions entries =
    276   lazyList
    277     (_ : lazyList
    278       (_ : pure (err "module requires an export" t))
    279       (_ _ : sourceModulePutManifest root (reverse entries))
    280       entries)
    281     (name rest : lazyMaybe
    282       (_ : pure (err "undeclared local export" t))
    283       (tree : onResult_ (sourceObjectPutTree root tree)
    284         (problem : pure (err problem t))
    285         (hash : lazyMaybe
    286           (_ : self rest root definitions (pair (pair name hash) entries))
    287           (_ : pure (err "duplicate export" t))
    288           (sourceFindExternal entries name)))
    289       (sourceFindExternal definitions name))
    290     names
    291 
    292 -- One native header interpretation for tri, SCP and map staging. The result is
    293 -- (ordered local edges, (import selections, (export selections, masked body))).
    294 -- Masking keeps original character offsets and line/column locations. Local
    295 -- imports and re-exports acquire edges; immutable hashes never do. !source is
    296 -- build-only and cannot duplicate an acquired edge, even later in the header.
    297 sourceHeaderLine_ self bytes reversed = (lazyList
    298   (_ : pair (reverse reversed) t)
    299   (byte rest : lazyBool (_ : pair (reverse reversed) bytes)
    300     (_ : self rest (pair byte reversed)) (equal? byte 10)) bytes)
    301 sourceHeaderLine bytes = y sourceHeaderLine_ bytes t
    302 sourceHeaderComment? word = (lazyList (_ : false)
    303   (a rest : lazyList (_ : false)
    304     (b tail : and? (equal? a 45) (equal? b 45)) rest) word)
    305 sourceHeaderMask byte = (lazyBool (_ : byte) (_ : 32)
    306   (or? (equal? byte 10) (equal? byte 13)))
    307 sourceHeaderError message position =
    308   err (parserDiagnostic 40 message t position t) t
    309 sourceHeaderContains_ self names name = (lazyList
    310   (_ : false)
    311   (item rest : lazyBool (_ : true) (_ : self rest name)
    312     (equal? item name)) names)
    313 sourceHeaderRefValid ref =
    314   or? (sourceModuleDigest? ref) (sourceModuleAliasValid ref)
    315 sourceHeaderEdge ref deps = (lazyBool
    316   (_ : deps)
    317   (_ : pair ref deps)
    318   (or? (sourceModuleDigest? ref) (y sourceHeaderContains_ deps ref)))
    319 sourceHeaderNext self policy line rest deps built uses exports prefix position =
    320   (let newline = lazyList (_ : t) (_ _ : [10]) rest in
    321    let full = append line newline in
    322    let next = lazyList (_ : t) (_ tail : tail) rest in
    323    self next policy deps built uses exports
    324      (append (reverse (map sourceHeaderMask full)) prefix)
    325      (foldl sourcePositionAdvance position full))
    326 sourceHeaderSourceShape arguments = (lazyList
    327   (_ : err "!source requires a module name" t)
    328   (name extra : lazyList
    329     (_ : lazyBool (_ : ok name t) (_ : err "invalid build-only source" t)
    330       (and? (sourceModuleAliasValid name) (not? (sourceModuleDigest? name))))
    331     (_ _ : err "unexpected !source arguments" t) extra) arguments)
    332 sourceHeader_ self bytes policy deps built uses exports prefix position = (lazyList
    333   (_ : ok (pair (reverse deps) (pair (reverse uses)
    334     (pair (reverse exports) (reverse prefix)))) t)
    335   (_ _ : let split = sourceHeaderLine bytes in
    336     let line = fst split in
    337     let rest = snd split in
    338     lazyList
    339       (_ : sourceHeaderNext self policy line rest deps built uses exports prefix position)
    340       (word arguments : lazyBool
    341         (_ : sourceHeaderNext self policy line rest deps built uses exports prefix position)
    342         (_ : lazyBool
    343           (_ : lazyResult
    344             (problem _ : sourceHeaderError problem position)
    345             (name _ : lazyBool
    346               (_ : sourceHeaderError "redundant build-only source" position)
    347               (_ : sourceHeaderNext self policy line rest (pair name deps)
    348                 (pair name built) uses exports prefix position)
    349               (y sourceHeaderContains_ deps name))
    350             (sourceHeaderSourceShape arguments))
    351           (_ : lazyBool
    352             (_ : lazyResult
    353               (problem _ : sourceHeaderError problem position)
    354               (spec _ : lazyBool
    355                 (_ : sourceHeaderError "redundant build-only source" position)
    356                 (_ : sourceHeaderNext self policy line rest
    357                   (sourceHeaderEdge (fst spec) deps) built
    358                   (pair arguments uses) exports prefix position)
    359                 (y sourceHeaderContains_ built (fst spec)))
    360               (bindResult (sourceModuleUseShape arguments)
    361                 (spec _ : bindResult (policy spec) (_ _ : ok spec t))))
    362             (_ : lazyBool
    363               (_ : lazyResult
    364                 (problem _ : sourceHeaderError problem position)
    365                 (spec _ : lazyBool
    366                   (_ : lazyBool
    367                     (_ : sourceHeaderError "redundant build-only source" position)
    368                     (_ : lazyBool
    369                       (_ : sourceHeaderNext self policy line rest
    370                         (sourceHeaderEdge (snd spec) deps) built uses
    371                         (pair arguments exports) prefix position)
    372                       (_ : sourceHeaderError "invalid re-export reference" position)
    373                       (sourceHeaderRefValid (snd spec)))
    374                     (y sourceHeaderContains_ built (snd spec)))
    375                   (_ : sourceHeaderNext self policy line rest deps built uses
    376                     (pair arguments exports) prefix position)
    377                   (equal? (fst spec) "from"))
    378                 (sourceModuleExportShape arguments))
    379               (_ : lazyBool
    380                 (_ : sourceHeaderError "unknown native header directive" position)
    381                 (_ : ok (pair (reverse deps) (pair (reverse uses)
    382                   (pair (reverse exports) (append (reverse prefix) bytes)))) t)
    383                 (equal? (head word) 33))
    384               (equal? word "!export"))
    385             (equal? word "!import"))
    386           (equal? word "!source"))
    387         (sourceHeaderComment? word))
    388       (words line)) bytes)
    389 sourceModuleHeaderStageWith policy source =
    390   y sourceHeader_ source policy t t t t t sourceStart
    391 sourceModuleHeaderStage source =
    392   sourceModuleHeaderStageWith (spec : ok t t) source
    393 sourceModuleStage source = (bindResult (sourceModuleHeaderStage source)
    394   (staged _ : ok (snd staged) t))
    395 
    396 -- Import selections are parsed once by the shared interpreter and by immutable
    397 -- pin rewriting. A local name supplies its default qualifier; a hash cannot.
    398 sourceModuleUseShape arguments = (bindResult
    399   (lazyList
    400     (_ : err "!import requires a reference" t)
    401     (ref tail : lazyList
    402       (_ : lazyBool
    403         (_ : err "hash imports require an alias or *" t)
    404         (_ : ok (pair ref ref) t) (sourceModuleDigest? ref))
    405       (second more : lazyBool
    406         (_ : lazyList (_ : ok (pair ref "*") t)
    407           (_ _ : err "unexpected !import arguments" t) more)
    408         (_ : lazyBool
    409           (_ : lazyList
    410             (_ : err "!import requires an alias" t)
    411             (alias end : lazyList (_ : ok (pair ref alias) t)
    412               (_ _ : err "unexpected !import arguments" t) end) more)
    413           (_ : err "expected !import REF [as Alias | *]" t)
    414           (equal? second "as"))
    415         (equal? second "*")) tail) arguments)
    416   (spec _ : lazyBool
    417     (_ : ok spec t)
    418     (_ : err "invalid import reference or qualifier" t)
    419     (and? (sourceHeaderRefValid (fst spec))
    420       (or? (equal? (snd spec) "*") (sourceModuleAliasValid (snd spec))))))
    421 
    422 sourceModuleExportShape words =
    423   lazyList
    424     (_ : err "!export requires a name" t)
    425     (name rest : lazyList
    426       (_ : ok (pair name t) t)
    427       (from tail : lazyBool
    428         (_ : lazyBool
    429           (_ : lazyList
    430             (_ : err "missing re-export manifest" t)
    431             (hash end : lazyList
    432               (_ : ok (pair "from" hash) t)
    433               (_ _ : err "unexpected !export arguments" t)
    434               end)
    435             tail)
    436           (_ : err "only !export * from HASH is supported" t)
    437           (equal? name "*"))
    438         (_ : err "expected !export * from HASH" t)
    439         (equal? from "from"))
    440       rest)
    441     words
    442 
    443 sourceModuleExtendUses_ self pending getManifest root environment =
    444   lazyList
    445     (_ : pure (ok environment t))
    446     (words rest : lazyResult
    447       (problem unused : pure (err problem t))
    448       (spec unused : onResult_ (getManifest (fst spec))
    449         (problem : pure (err problem t))
    450         (entries : sourceModuleExtendOne root entries (snd spec) environment
    451           (next : self rest getManifest root next)))
    452       (sourceModuleUseShape words))
    453     pending
    454 sourceModuleExtendUsesWith getManifest root uses =
    455   y sourceModuleExtendUses_ uses getManifest root t
    456 sourceModuleExtendUses root uses =
    457   sourceModuleExtendUsesWith (sourceModuleGetRefManifest root) root uses
    458 
    459 sourceModuleQualified alias name =
    460   lazyBool
    461     (_ : name)
    462     (_ : append alias (append "." name))
    463     (equal? alias "*")
    464 sourceModuleExtendOne_ self entries root alias environment next =
    465   lazyList
    466     (_ : next environment)
    467     (entry rest :
    468       lazyMaybe
    469         (_ : onResult_ (sourceObjectGetTree root (snd entry))
    470           (problem : pure (err problem t))
    471           (tree : self rest root alias (pair
    472             (pair (sourceModuleQualified alias (fst entry)) tree)
    473             environment) next))
    474         (_ : pure (err "duplicate imported name" t))
    475         (sourceFindExternal environment
    476           (sourceModuleQualified alias (fst entry))))
    477     entries
    478 sourceModuleExtendOne root entries alias environment next =
    479   y sourceModuleExtendOne_ entries root alias environment next
    480 
    481 sourceModuleExportAll_ self entries root definitions selected =
    482   lazyList
    483     (_ : pure (ok selected t))
    484     (entry rest : lazyMaybe
    485       (_ : onResult_ (sourceObjectPutTree root (snd entry))
    486         (problem : pure (err problem t))
    487         (hash : self rest root definitions
    488           (pair (pair (fst entry) hash) selected)))
    489       (_ : pure (err "duplicate export" t))
    490       (sourceFindExternal selected (fst entry)))
    491     entries
    492 sourceModuleExportAll root definitions selected =
    493   y sourceModuleExportAll_ definitions root definitions selected
    494 
    495 sourceModuleAddEntries_ self incoming root selected =
    496   lazyList
    497     (_ : pure (ok selected t))
    498     (entry rest : lazyMaybe
    499       (_ : onResult_ (sourceObjectGetTree root (snd entry))
    500         (problem : pure (err problem t))
    501         (_ : self rest root (pair entry selected)))
    502       (_ : pure (err "duplicate re-export" t))
    503       (sourceFindExternal selected (fst entry)))
    504     incoming
    505 sourceModuleAddEntries root incoming selected =
    506   y sourceModuleAddEntries_ incoming root selected
    507 
    508 sourceModuleSelect_ self pending getManifest root definitions selected =
    509   lazyList
    510     (_ : lazyList
    511       (_ : pure (err "module requires an export" t))
    512       (_ _ : sourceModulePutManifest root (reverse selected))
    513       selected)
    514     (words rest : lazyResult
    515       (problem unused : pure (err problem t))
    516       (request unused : lazyBool
    517         (_ : onResult_ (getManifest (snd request))
    518           (problem : pure (err problem t))
    519           (entries : onResult_ (sourceModuleAddEntries root entries selected)
    520             (problem : pure (err problem t))
    521             (new : self rest getManifest root definitions new)))
    522         (_ : lazyBool
    523           (_ : onResult_ (sourceModuleExportAll root definitions selected)
    524             (problem : pure (err problem t))
    525             (new : self rest getManifest root definitions new))
    526           (_ : lazyMaybe
    527             (_ : pure (err "undeclared local export" t))
    528             (tree : lazyMaybe
    529               (_ : onResult_ (sourceObjectPutTree root tree)
    530                 (problem : pure (err problem t))
    531                 (hash : self rest getManifest root definitions
    532                   (pair (pair (fst request) hash) selected)))
    533               (_ : pure (err "duplicate export" t))
    534               (sourceFindExternal selected (fst request)))
    535             (sourceFindExternal definitions (fst request)))
    536           (equal? (fst request) "*"))
    537         (equal? (fst request) "from"))
    538       (sourceModuleExportShape words))
    539     pending
    540 sourceModuleSelectWith getManifest root definitions exports =
    541   y sourceModuleSelect_ exports getManifest root definitions t
    542 sourceModuleSelect root definitions exports =
    543   sourceModuleSelectWith (sourceModuleGetRefManifest root) root definitions exports
    544 
    545 -- End-to-end source entrypoint: stage -> verify/hydrate immutable manifest
    546 -- imports -> compile source -> store executable trees -> publish manifest.
    547 -- The graph supplies already authenticated, exact-kind/ABI manifest entries.
    548 -- Standalone builds still resolve and verify manifests through the ordinary IO
    549 -- reader. The resolver never bypasses executable-tree verification.
    550 sourceModuleBuildResolvedWith getManifest compileDefinitions root staged =
    551   (onResult_ (sourceModuleExtendUsesWith getManifest root (fst staged))
    552     (problem : pure (err problem t))
    553     (environment : lazyResult
    554       (problem unused : pure (err problem t))
    555       (definitions unused : sourceModuleSelectWith getManifest root definitions
    556         (fst (snd staged)))
    557       (compileDefinitions environment (snd (snd staged)))))
    558 sourceModuleBuildStagedWith compileDefinitions root staged =
    559   sourceModuleBuildResolvedWith (sourceModuleGetRefManifest root) compileDefinitions root staged
    560 sourceModuleBuildWith compileDefinitions root source = (lazyResult
    561   (problem unused : pure (err problem t))
    562   (staged unused : sourceModuleBuildStagedWith compileDefinitions root staged)
    563   (sourceModuleStage source))
    564 
    565 sourceModuleBuild root source = sourceModuleBuildWith compileModuleDefinitions root source
    566 
    567 
    568 sourceModuleBuildStaged root staged =
    569   sourceModuleBuildStagedWith compileModuleDefinitions root staged