# This encodes a simple sum type of two constructors; in Haskell this would be:
# data Period = DurationPeriod { endDate :: Date, duration :: Int }
#             | DatePeriod { endDate :: Date, startDate :: Date }

class Period:
    def __str__(self):
        return self.match(
            if_duration = lambda end_date, duration: "end_date: {0}, duration: {1}".format(str(end_date), str(duration)), 
            if_date = lambda end_date, start_date: "end_date: {0}, start_date: {1}".format(str(end_date), str(start_date)))

class DurationPeriod(Period):
    def __init__(self, end_date, duration):
        self.end_date = end_date
        self.duration = duration

    def match(self, if_duration, if_date):
        return if_duration(self.end_date, self.duration)

class DatePeriod(Period):
    def __init__(self, end_date, start_date):
        self.end_date = end_date
        self.start_date = start_date

    def match(self, if_duration, if_date):
        return if_date(self.end_date, self.start_date)