> type No = Int
>
> packFirstFit :: [Item] -> [Bin]
> packFirstFit is = [ prio b | b <- toOrdList q ]
> where (q, _) = foldl firstFit (empty, 0) is
>
> firstFit :: (PSQ No Bin, No) -> Item -> (PSQ No Bin, No)
> firstFit (q, n) i = case atMost (1 - i) q of
> [] -> (insert (n :-> i) q, n + 1)
> (k :-> _) : _ -> (adjust (+ i) k q, n)
|