tricu

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

fb609a75a12659d2a05a63681c0cf96ef606045b4aebe044eac077c8cd23fbf2.tri (23838B)


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