@@ -16,63 +16,93 @@ module Edge = struct
1616end
1717
1818module S = Namespaced. Set
19+ module Externals = Name. Set
1920type dep = { path : Namespaced .t ; edge :Edge .t ; pkg :Pkg .t ; aliases :S .t }
2021type subdep = { edge :Edge .t ; pkg :Pkg .t ; aliases :S .t }
2122module Map = Namespaced .Map
22- type t = subdep Map .t
23+ type t = { units : subdep Map .t ; externals : Externals .t }
2324
2425let sch: t Schematic. t =
2526 let module T = Schematic. Tuple in
26- let from_list = let open T in
27- List. fold_left
28- (fun m [k ; edge ; pkg ; aliases ] -> Map. add k {edge;pkg;aliases} m)
29- Map. empty in
30- let to_list m =
31- Map. fold (fun k {edge;pkg;aliases} l -> T. [k;edge;pkg;aliases] :: l) m [] in
27+ let from_ = let open T in
28+ fun [units ; externals ] ->
29+ let units =
30+ List. fold_left
31+ (fun m [k ; edge ; pkg ; aliases ] -> Map. add k {edge;pkg;aliases} m)
32+ Map. empty units
33+ in
34+ { units; externals = Externals. of_list externals }
35+ in
36+ let to_ { units = m ; externals } =
37+ T. (::)(
38+ (Map. fold (fun k {edge;pkg;aliases} l -> T. [k;edge;pkg;aliases] :: l) m [] ),
39+ T. [Externals. elements externals]
40+ )
41+ in
3242 let open Schematic in
33- custom (Array [Namespaced. sch; Edge. sch; Pkg. sch; S. sch])
34- to_list from_list
43+ custom ([ Array [Namespaced. sch; Edge. sch; Pkg. sch; S. sch]; Array String ])
44+ to_ from_
3545
3646module Pth = Paths. S
3747module P = Pkg
3848
39- let empty = Map. empty
49+ let empty = { units = Map. empty; externals = Externals. empty }
4050
41- let update ~path ?(aliases =S. empty) ~edge pkg deps : t =
51+ let update ~path ?(aliases =S. empty) ~edge pkg { units; externals } : t =
4252 let ep =
4353 let update x =
4454 let aliases = S. union aliases x.aliases in
4555 { x with edge = Edge. max edge x.edge; aliases } in
4656 Option. either update {edge;pkg; aliases }
47- (Map. find_opt path deps) in
48- Map. add path ep deps
57+ (Map. find_opt path units) in
58+ let units = Map. add path ep units in
59+ { units; externals }
60+
61+ let add_external ext deps = { deps with externals = Externals. add ext deps.externals }
62+ let add_externals ext deps =
63+ let externals = List. fold_left (fun s x -> Externals. add x s) deps.externals ext in
64+ { deps with externals }
65+ let externals_only d = { empty with externals = d.externals }
4966
5067let make ~path ?aliases ~edge pkg = update ~path ?aliases ~edge pkg empty
5168
52- let merge =
53- Map. union (fun _k x y ->
54- let aliases = S. union x.aliases y.aliases in
55- Some { y with edge = Edge. max x.edge y.edge; aliases })
69+ let merge x y =
70+ let units =
71+ Map. union (fun _k x y ->
72+ let aliases = S. union x.aliases y.aliases in
73+ Some { y with edge = Edge. max x.edge y.edge; aliases }
74+ ) x.units y.units
75+ in
76+ let externals = Externals. union x.externals y.externals in
77+ { units; externals }
5678
5779let (+ ) = merge
5880
5981
6082let find path deps =
61- Option. fmap (fun {edge;pkg;aliases} -> {path;edge;pkg;aliases}) @@ Map. find_opt path deps
83+ Option. fmap (fun {edge;pkg;aliases} -> {path;edge;pkg;aliases}) @@ Map. find_opt path deps.units
6284let fold f deps acc =
63- Map. fold (fun path {edge;pkg;aliases} -> f {path;edge;pkg;aliases}) deps acc
85+ Map. fold (fun path {edge;pkg;aliases} -> f {path;edge;pkg;aliases}) deps.units acc
6486
6587let pp_elt ppf (path , {edge;pkg;aliases} ) =
6688 Pp. fp ppf " %s%a(%a)%a" (if edge = Edge. Normal then " " else " ε∙" )
6789 Namespaced. pp path P. pp pkg S. pp aliases
6890
6991let pp ppf s =
70- Pp. fp ppf " @[<hov>{%a}@]" (Pp. list pp_elt) (Map. bindings s)
92+ Pp. fp ppf " @[<v>externals:@[<hov>]%a@,@[<hov>{%a}@]@]"
93+ Pp. (list string ) (Externals. elements s.externals)
94+ (Pp. list pp_elt) (Map. bindings s.units)
7195
7296let of_list l =
73- List. fold_left (fun m {path;edge;pkg;aliases} -> Map. add path {edge; pkg; aliases} m) empty l
97+ let units =
98+ List. fold_left
99+ (fun m {path;edge;pkg;aliases} -> Map. add path {edge; pkg; aliases} m)
100+ empty.units l
101+ in
102+ { units; externals = Externals. empty }
74103
75104let pkgs deps = fold (fun {pkg; _ } x -> pkg :: x) deps []
76105let paths deps = fold (fun {path; _ } x -> path :: x) deps []
106+ let externals deps = Externals. elements deps.externals
77107let all deps = fold List. cons deps []
78- let pkg_set x = Map. fold (fun _ x s -> P.Set. add x.pkg s) x P.Set. empty
108+ let pkg_set x = Map. fold (fun _ x s -> P.Set. add x.pkg s) x.units P.Set. empty
0 commit comments