extension CaseIterable where Self: Equatable {
    func next(nilAtEnd: Bool = false) -> Self! {
        let all = Self.allCases
        let index = all.firstIndex(of: self)!
        let next = all.index(after: index)

        if nilAtEnd == true {
            if next == all.endIndex {
                return nil
            }
        }

        return all[next == all.endIndex ? all.startIndex : next]
    }
}