
Layers.pudu
Pudu40 lines1.5 KB
1/** @Domain.Layers.Module — which assignment of a key is kept */2module PuduLangEnvironment.Domain.Layers34/** @Domain.Layers.Entry — one assignment, in file order */5export type Entry = { key: Str, value: Str }67/** @Domain.Layers.Settled — loaded values settled over the process */8export type Settled = { values: Map[Str, Str], applied: Array[Str] }91011export fn keep(known: &Map[Str, Str], key: Str, value: Str, overwrite: Bool) -> Map[Str, Str] {12 if overwrite || !known.containsKey(key) { known.insert(key, value) } else { *known }13}141516export fn merge(layers: &Array[Array[Entry]], overwrite: Bool) -> Map[Str, Str] {17 var merged: Map[Str, Str] = mapOf([])18 for layer in layers {19 for entry in layer {20 merged = keep(&merged, entry.key, entry.value, overwrite)21 }22 }23 merged24}25262728export fn settle(loaded: &Map[Str, Str], process: &Map[Str, Str], overwrite: Bool) -> Settled {29 var values = *process30 var applied: Array[Str] = []31 for pair in loaded.entries() {32 let held = process.get(pair[0])33 if overwrite || held == None || held == Some("") {34 values = values.insert(pair[0], pair[1])35 applied = applied.push(pair[0])36 }37 }38 Settled{values: values, applied: applied}39}40