# Haskell Quiz/DayRange/Solution Jethr0

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

```-- > dayRange [1,2,3,6,7]
-- "Mon-Wed, Sat, Sun"
module DayRange where
import Data.List (intersperse,sort)

-- > dayRange [1,2,3,6,7]
-- "Mon-Wed, Sat, Sun"
data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Show,Enum)

dayRange :: [Int] -> String
dayRange = sepComma . map range . map (map toWeekday) . groupBy' (\a b -> a+1 == b) . sort
where sepComma    = concat . intersperse ", "
toWeekday x = show \$ (toEnum (x-1) :: Weekday)
range xs | length xs < 3 = sepComma xs
| otherwise     = head xs ++ "-" ++ last xs

-- groupBy compares any element to the first one of the group
-- groupBy' instead compares an element to the last added group element
groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy' f (x:xs) = gb f xs [[x]]
where gb f (x:xs) ((a:as):bs) = gb f xs \$ if f a x then ((x:a:as):bs)
else ([x]:(a:as):bs)
gb _ []     as = reverse . map reverse \$ as
```