     internal let hash      : Int64
 }
 
-extension DatePattern {
-    internal func secondPattern() -> NumberSet {
+internal extension DatePattern {
+    func secondPattern() -> NumberSet {
         return (try? second.toSecondPattern(hash)) ?? .none
     }
-    internal func minutePattern() -> NumberSet {
+    func minutePattern() -> NumberSet {
         return (try? minute.toMinutePattern(hash)) ?? .none
     }
-    internal func hourPattern() -> NumberSet {
+    func hourPattern() -> NumberSet {
         return (try? hour.toHourPattern(hash)) ?? .none
     }
-    internal func dayOfMonthPattern(month: Int, year: Int) -> NumberSet {
+    func dayOfMonthPattern(month: Int, year: Int) -> NumberSet {
         precondition(1...12 ~= month)
         let dayValue  = (try? dayOfMonth.toDayOfMonthPattern(month: month, year: year, hash: hash)) ?? .none
         let weekValue = (try? dayOfWeek.toDayOfWeekPattern(month: month, year: year, hash: hash)) ?? .none
         return .and(dayValue, weekValue)
     }
-    internal func monthPattern() -> NumberSet {
+    func monthPattern() -> NumberSet {
         return (try? self.month.toMonthPattern()) ?? .none
     }
-    internal func yearPattern() -> NumberSet {
+    func yearPattern() -> NumberSet {
         return (try? self.year.toYearPattern()) ?? .none
     }
 }
 
-extension DatePattern {
+public extension DatePattern {
     func next(_ date: Date) -> Date? {
         if !yearPattern().contains(date.year) {
             return nextYear(date)

            hour: date.hour, minute: nextMinute, second: firstSecond)
    }

    internal func nextSecond(_ date: Date) -> Date? {
        guard let nextSecond = secondPattern().next(date.second) else {
            return nextMinute(date)
        }

            hour: firstHour, minute: firstMinute, second: firstSecond)
    }

    func nextHour(_ date: Date) -> Date? {
        guard let nextHour = hourPattern().next(date.hour) else {
            return nextDay(date)
        }
