# 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)