Haskell multi-key record sort with nulls last
Haskell
import Data.List (sortBy)
import Data.Ord (comparing)
data Person = Person { personName :: String, personAge :: Maybe Int }
deriving (Show)
comparePeople :: Person -> Person -> Ordering
comparePeople a b = comparing personName a b <> compareAges (personAge a) (personAge b)
where
compareAges Nothing Nothing = EQ
compareAges Nothing (Just _) = GT
compareAges (Just _) Nothing = LT
compareAges (Just x) (Just y) = compare x y
sortPeople :: [Person] -> [Person]
sortPeople = sortBy comparePeople