internal static T2 Last <T1, T2>(T1 timePeriod) // TODO provide optional parameter to handle what happens if result End property doesn't equal timePeriod.End?
     where T1 : ITimePeriod <T1>
     where T2 : ITimePeriod <T2>
 {
     return(TimePeriodFactory.FromDateTime <T2>(timePeriod.End).Previous());
 }
 internal static T2 First <T1, T2>(T1 timePeriod) // TODO provide optional parameter to handle what happens if result Start property doesn't equal timePeriod.Start?
     where T1 : ITimePeriod <T1>
     where T2 : ITimePeriod <T2>
 {
     return(TimePeriodFactory.FromDateTime <T2>(timePeriod.Start));
 }