summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_compile/tc087.hs
blob: dd910f21a9396ef2c6d848d424507a1d51bda6c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{-# 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"