content: {-# LANGUAGE Safe #-}
  {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  
  -- Here we stop it succeeding (SAFE)
  
  -- | We use newtype to create an isomorphic type to Int
  -- with a reversed Ord dictionary. We now use the MinList
  -- API of Y1 to create a new MinList. Then we use newtype
  -- deriving to convert the newtype MinList to an Int
  -- MinList. This final result breaks the invariants of
  -- MinList which shouldn't be possible with the exposed
  -- API of Y1.
  module Main where
  
  import SafeLang07_A
  
  class IntIso t where
      intIso :: c t -> c Int
  
  instance IntIso Int where
      intIso = id
  
  newtype Down a = Down a deriving (Eq, Show, IntIso)
  
  instance Ord a => Ord (Down a) where
      compare (Down a) (Down b) = compare b a
  
  forceInt :: MinList Int -> MinList Int
  forceInt = id
  
  a1, a2 :: MinList Int
  a1 = foldl insertMinList (newMinList $ head nums) (tail nums)
  a2 = forceInt $ intIso $ foldl (\x y -> insertMinList x $ Down y) (newMinList $ Down $ head nums) (tail nums)
  
  nums :: [Int]
  nums = [1,4,0,1,-5,2,3,5,-1,2,0,0,-4,-3,9]
  
  main = do
      printIntMinList a1
      printIntMinList a2
  
  