{-# LANGUAGE RankNTypes #-}

module ShouldSucceed where

data SeqView t a              =  Null
                              |  Cons a (t a)

class PriorityQueue q where
    empty                       :: (Ord a) => q a
    single                      :: (Ord a) => a -> q a
    insert                      :: (Ord a) => a -> q a -> q a
    meld                        :: (Ord a) => q a -> q a -> q a
    splitMin                    :: (Ord a) => q a -> SeqView q a
    insert a q          =  single a `meld` q

toOrderedList q         =  case splitMin q of
   Null                 -> []
   Cons a q             -> a : toOrderedList q

insertMany x q          =  foldr insert q x
pqSort q x              =  toOrderedList (insertMany x q)

check                   :: forall q. (PriorityQueue q) => (forall a. Ord a => q a) -> IO ()
check empty             =  do
    putStr "*** sorting\n"
    out (pqSort empty [1 .. 99])
    out (pqSort empty [1.0, 1.1 ..99.9])

out                             :: (Eq a, Num a) => [a] -> IO ()
out x | sum x == 0              =  putStr "ok\n"
      | otherwise               =  putStr "ok\n"

