aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/tool/compiler/meta/packager/script.lux
blob: 38253641735b9b069e00713eedaed76680a1747a (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
(.using
 [library
  [lux (.except)
   [type (.only sharing)]
   [abstract
    ["[0]" monad (.only Monad do)]]
   [control
    ["[0]" try (.only Try)]]
   [data
    [binary (.only Binary)]
    ["[0]" product]
    [text
     ["%" \\format (.only format)]
     [encoding 
      ["[0]" utf8]]]
    [collection
     ["[0]" sequence]
     ["[0]" set (.only Set)]
     ["[0]" list (.open: "[1]#[0]" functor)]]]]]
 ["[0]" // (.only Packager)
  [//
   ["[0]" archive (.only Output)
    ["[0]" artifact]
    ["[0]" unit]
    ["[0]" module (.only)
     ["[0]" descriptor]]]
   ["[0]" cache
    [dependency
     ["[1]/[0]" module]
     ["[1]/[0]" artifact]]]
   ["[0]" io
    ["[1]" archive]]
   [//
    [language
     ["$" lux]]]]])

(def: (write_module necessary_dependencies sequence [module_id output] so_far)
  (All (_ directive)
    (-> (Set unit.ID) (-> directive directive directive) [module.ID Output] directive
        (Try directive)))
  (|> output
      sequence.list
      (list.all (function (_ [artifact_id custom content])
                  (if (set.member? necessary_dependencies [module_id artifact_id])
                    {.#Some content}
                    {.#None})))
      (monad.mix try.monad
                 (function (_ content so_far)
                   (|> content
                       (at utf8.codec decoded)
                       (at try.monad each
                           (|>> as_expected
                                (is directive)
                                (sharing [directive]
                                  (is directive
                                      so_far))
                                (sequence so_far)))))
                 so_far)))

(def: .public (package header code sequence scope)
  (All (_ directive)
    (-> directive
        (-> directive Text)
        (-> directive directive directive)
        (-> directive directive)
        Packager))
  (function (package host_dependencies archive program)
    (do [! try.monad]
      [.let [necessary_dependencies (cache/artifact.necessary_dependencies archive)]
       order (cache/module.load_order $.key archive)]
      (|> order
          (list#each (function (_ [module [module_id entry]])
                       [module_id (the archive.#output entry)]))
          (monad.mix ! (..write_module necessary_dependencies sequence) header)
          (at ! each (|>> scope
                          code
                          (at utf8.codec encoded)
                          {.#Left}))))))