aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/tool/compiler/meta/packager/script.lux
blob: bbbba49786840e2447a2d7e65b982338129d9751 (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
(.module:
  [lux #*
   [type (#+ :share)]
   [abstract
    ["." monad (#+ Monad do)]]
   [control
    ["." try (#+ Try)]
    [security
     ["!" capability]]]
   [data
    [binary (#+ Binary)]
    [text
     ["%" format (#+ format)]
     ["." encoding]]
    [collection
     ["." row]
     ["." list ("#@." functor)]]]
   [world
    ["." file (#+ File Directory)]]]
  [program
   [compositor
    ["." static (#+ Static)]]]
  ["." // (#+ Packager)
   [//
    ["." archive
     ["." descriptor]
     ["." artifact]]
    [cache
     ["." dependency]]
    ["." io #_
     ["#" archive]]
    [//
     [language
      ["$" lux
       [generation (#+ Context)]]]]]])

## TODO: Delete ASAP
(type: (Action ! a)
  (! (Try a)))

(def: (write-artifact monad file-system static context)
  (All [!]
    (-> (Monad !) (file.System !) Static Context
        (Action ! Binary)))
  (do (try.with monad)
    [artifact (let [[module artifact] context]
                (!.use (:: file-system file) [(io.artifact file-system static module (%.nat artifact))]))]
    (!.use (:: artifact content) [])))

(def: (write-module monad file-system static sequence [module artifacts] so-far)
  (All [! directive]
    (-> (Monad !) (file.System !) Static (-> directive directive directive) [archive.ID (List artifact.ID)] directive
        (Action ! directive)))
  (monad.fold (:assume (try.with monad))
              (function (_ artifact so-far)
                (do (try.with monad)
                  [content (..write-artifact monad file-system static [module artifact])
                   content (:: monad wrap (encoding.from-utf8 content))]
                  (wrap (sequence so-far
                                  (:share [directive]
                                          {directive
                                           so-far}
                                          {directive
                                           (:assume content)})))))
              so-far
              artifacts))

(def: #export (package header to-code sequence)
  (All [! directive]
    (-> directive
        (-> directive Text)
        (-> directive directive directive)
        (Packager !)))
  (function (package monad file-system static archive program)
    (do {@ (try.with monad)}
      [cache (!.use (:: file-system directory) [(get@ #static.target static)])
       order (:: monad wrap (dependency.load-order $.key archive))]
      (|> order
          (list@map (function (_ [module [module-id [descriptor document]]])
                      [module-id
                       (|> descriptor
                           (get@ #descriptor.registry)
                           artifact.artifacts
                           row.to-list
                           (list@map (|>> (get@ #artifact.id))))]))
          (monad.fold @ (..write-module monad file-system static sequence) header)
          (:: @ map (|>> to-code encoding.to-utf8))))))