package main import ( "time" ) const ( //dailySupplyCharge = 105.750 / 100 // 1 July 2020 - 30 June 2021 //dailySupplyCharge = 98.234 / 100 // 1 July 2021 - 30 June 2022 //dailySupplyCharge = 98.234 / 100 // 1 July 2021 - 30 June 2022 dailySupplyCharge = 1.099030 // 1 July 2021 - 30 June 2022 //solarFeedInTariff = fixedTariff(8.471 / 100) // 1 July 2020 - 30 June 2021 //solarFeedInTariff = fixedTariff(6.501 / 100) // 1 July 2021 - 30 June 2022 solarFeedInTariff = fixedTariff(0.088830) // 1 July 2022 - 30 June 2023 ) var tariff93 = &onOffPeakTariff{ // 1 July 2020 - 30 June 2021: //onPeak: 32.137 / 100, //offPeak: 14.963 / 100, // 1 July 2021 - 30 June 2022: //onPeak: 29.852 / 100, //offPeak: 13.9 / 100, // 1 July 2022 - 30 June 2023: onPeak: 0.333990, offPeak: 0.155510, isPeak: (&weekdayHours{ zone: time.FixedZone("UTC+10", +10*60*60), on: [24]bool{ 7: true, 8: true, 9: true, 16: true, 17: true, 18: true, 19: true, 20: true, }, }).isPeak, } type tariff interface { pricePerKWh(time.Time) float64 } type fixedTariff float64 func (f fixedTariff) pricePerKWh(time.Time) float64 { return float64(f) } type onOffPeakTariff struct { onPeak, offPeak float64 isPeak func(time.Time) bool } func (o *onOffPeakTariff) pricePerKWh(t time.Time) float64 { if o.isPeak(t) { return o.onPeak } return o.offPeak } type weekdayHours struct { zone *time.Location on [24]bool } func (w *weekdayHours) isPeak(t time.Time) bool { t = t.In(w.zone) switch t.Weekday() { case time.Saturday, time.Sunday: return false default: return w.on[t.Hour()] } }