///|
/// Keep stage order outside format order: base primaries, member primaries,
/// then each adjacent stage, workspace before member within that stage.
fn Conventions::tier(self : Conventions, base : Layer, chosen : Layer?) -> Tier raise @config.ConfigError {
let has_member = chosen is Some(_)
let inherited = if has_member { key_paths(self.inherited) } else { [] }
let scoped = if has_member { key_paths(self.member_scope) } else { [] }
let sources = base.primaries.map(source => filtered(source, inherited, warn=false))
if chosen is Some(chosen) {
sources.append(chosen.primaries.map(source => filtered(source, scoped, warn=true)))
}
let count = base.adjacent.length().max(chosen.map(layer => layer.adjacent.length()).unwrap_or(0))
for index in 0.. filtered(source, inherited, warn=false)))
}
if chosen is Some(chosen) && chosen.adjacent.get(index) is Some(stage) {
sources.append(stage.map(source => filtered(source, scoped, warn=true)))
}
}
let locations = base.paths.map(path => (path, false))
if chosen is Some(chosen) {
locations.append(chosen.paths.map(path => (path, true)))
}
{ sources, has_member, locations, controls: base.controls }
}