Shortest longest

My solution:

    module Lib
    ( shortestLongest
    ) where
import Data.Foldable (foldr, foldr1)

shortestLongest :: [[[a]]] -> [[a]]
shortestLongest = panic . foldr1 donow . map (foldr1 dol8r . map defer)

-- | Wrap a `Now` value in zero or more `L8r` constructors.
data Procrastinate b = Now b | L8r (Procrastinate b)

-- | Defer list of length @n@ in @n@ layers of `L8r`.
defer :: [a] -> Procrastinate [[a]]
defer = foldr (const L8r) <$> Now . (:[]) <*> id

-- | Time's up, got to do it now.
panic :: Procrastinate a -> a
panic (L8r a) = panic a
panic (Now a) = a

-- | Prefer later
dol8r :: Procrastinate [a] -> Procrastinate [a] -> Procrastinate [a]
dol8r              (L8r a)              (L8r b)  = L8r $ dol8r a b
dol8r              (Now _)            b@(L8r _)  = b
dol8r            a@(L8r _)              (Now _)  = a
dol8r              (Now a)              (Now b)  = Now $ a <> b

-- | Prefer sooner
donow :: Procrastinate [a] -> Procrastinate [a] -> Procrastinate [a]
donow              (L8r a)              (L8r b)  = L8r $ donow a b
donow            a@(Now _)              (L8r _)  = a
donow              (L8r _)            b@(Now _)  = b
donow              (Now a)              (Now b)  = Now $ a <> b
/r/haskell Thread Parent Link - github.com