///|
pub struct BudgetLine {
  line : String
  amount : Amount
} derive(Debug, Eq)

///|
pub fn BudgetLine::new(line : String, amount : Amount) -> BudgetLine {
  { line, amount }
}

///|
pub struct BudgetVariance {
  line : String
  budget : Amount
  actual : Amount
  variance : Amount
  favorable : Bool
} derive(Debug, Eq)

///|
pub fn budget_variance(
  budget : Array[BudgetLine],
  actual : Array[BudgetLine],
) -> Array[BudgetVariance] {
  let result : Array[BudgetVariance] = []
  for expected in budget {
    let mut observed = 0
    for item in actual {
      if item.line == expected.line {
        observed = item.amount
        break
      }
    }
    let variance = observed - expected.amount
    result.push({
      line: expected.line,
      budget: expected.amount,
      actual: observed,
      variance,
      favorable: variance <= 0,
    })
  }
  result
}