import ImmutablePrioritySet from "../util/ImmutablePrioritySet"; import Predicate from "../util/Predicate"; import Accidental from "./Accidental"; import Key from "./Key"; import KeySignature from "./KeySignature"; import Letter from "./Letter"; interface Policy extends Predicate { } module Policy { export function prioritize(...policies: Policy[]): ImmutablePrioritySet { return ImmutablePrioritySet.of(policies); } export function matchLetter(letter: Letter): Policy { return k => k.getLetter() === letter; } export function matchAccidental(accidental: Accidental): Policy { return k => k.getAccidental().orElse(null) === accidental; } export function matchKeySignature(keySignature: KeySignature): Policy { const keys = Letter .values() .map(l => new Key(l)) .map(k => k.apply(keySignature)) return k => keys[k.getLetter().ordinal()].equals(k); } export const NONE = matchAccidental(null); export const NATURAL = matchAccidental(Accidental.NATURAL); export const NONE_OR_NATURAL = k => NONE(k) || NATURAL(k); export const SHARP = matchAccidental(Accidental.SHARP); export const DOUBLE_SHARP = matchAccidental(Accidental.DOUBLE_SHARP); export const TRIPLE_SHARP = matchAccidental(Accidental.TRIPLE_SHARP); export const SHARPS = k => SHARP(k) || DOUBLE_SHARP(k) || TRIPLE_SHARP(k); export const FLAT = matchAccidental(Accidental.FLAT); export const DOUBLE_FLAT = matchAccidental(Accidental.DOUBLE_FLAT); export const TRIPLE_FLAT = matchAccidental(Accidental.TRIPLE_FLAT); export const FLATS = k => FLAT(k) || DOUBLE_FLAT(k) || TRIPLE_FLAT(k); export const DEFAULT_PRIORITY = prioritize( NONE_OR_NATURAL, SHARP, FLAT ); } export default Policy;