aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/ffi/export.js.lux
blob: 96230b5e0ff2e65d14c2f0ba146346617b236236 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(.using
 [library
  [lux "*"
   [extension (.only directive:)]
   ["[0]" meta]
   ["[0]" static]
   [abstract
    ["[0]" monad (.only do)]]
   [control
    ["<>" parser
     ["<[0]>" code]]]
   [data
    [text
     ["%" format]]
    [collection
     ["[0]" list ("[1]#[0]" monad mix)]
     ["[0]" set]]]
   ["[0]" macro
    [syntax (.only syntax:)]
    ["[0]" code]]
   [math
    ["[0]" random]]
   [target
    ["/" js]]
   [tool
    [compiler
     ["[0]" phase]
     [meta
      [cache
       ["[0]" dependency "_"
        ["[1]" artifact]]]]
     [language
      [lux
       ["[0]" generation]
       ["[0]" directive]
       [analysis
        ["[0]" type]]]]]]]])

(def: definition
  (-> Code (Meta [Text Code]))
  (|>> (list)
       (<code>.result (<| <code>.form
                          (<>.after (<code>.this_text "lux def"))
                          (<>.before <code>.any)
                          (all <>.and
                               <code>.local
                               <code>.any)))
       meta.lifted))

(with_expansions [<extension> (static.random (|>> %.nat (%.format "lua export ") code.text)
                                             random.nat)]
  (directive: (<extension> self phase archive [name <code>.text
                                               term <code>.any])
    (do [! phase.monad]
      [next directive.analysis
       [_ term] (<| directive.lifted_analysis
                    type.inferring
                    (next archive term))

       next directive.synthesis
       term (directive.lifted_synthesis
             (next archive term))

       dependencies (directive.lifted_generation
                     (dependency.dependencies archive term))

       next directive.generation
       [interim_artifacts term] (directive.lifted_generation
                                 (generation.with_interim_artifacts archive
                                   (next archive term)))

       _ (directive.lifted_generation
          (do !
            [@self (generation.learn_custom name (list#mix set.has dependencies interim_artifacts))
             .let [$module (/.var "module")
                   $exports (/.the "exports" $module)
                   definition (/.define (/.var name) term)
                   export (/.when (/.not (/.= (/.string "undefined") (/.type_of $module)))
                                  (/.set (/.the name $exports) (/.var name)))
                   code (all /.then
                             definition
                             export)]
             _ (generation.execute! definition)
             _ (generation.save! @self {.#None} code)]
            (generation.log! (%.format "Export " (%.text name)))))]
      (in directive.no_requirements)))

  (syntax: .public (export: [exports (<>.many <code>.any)])
    (let [! meta.monad]
      (|> exports
          (monad.each ! macro.expansion)
          (# ! each (|>> list#conjoint
                         (monad.each ! ..definition)))
          (# ! conjoint)
          (# ! each (list#each (function (_ [name term])
                                 (` (<extension> (~ (code.text name)) (~ term))))))))))