module SubHask.Algebra.Ord
where
import qualified Prelude as P
import qualified Data.List as L
import qualified GHC.Arr as Arr
import Data.Array.ST hiding (freeze,thaw)
import Control.Monad
import Control.Monad.Random
import Control.Monad.ST
import Prelude (take)
import SubHask.Algebra
import SubHask.Category
import SubHask.Mutable
import SubHask.SubType
import SubHask.Internal.Prelude
import SubHask.TemplateHaskell.Deriving
newtype WithPreludeOrd a = WithPreludeOrd { unWithPreludeOrd :: a }
deriving Storable
instance Show a => Show (WithPreludeOrd a) where
show (WithPreludeOrd a) = show a
deriveHierarchyFiltered ''WithPreludeOrd [ ''Eq_, ''Enum, ''Boolean, ''Ring, ''Metric ] [ ''Show ]
instance Eq a => P.Eq (WithPreludeOrd a) where
a==b = a==b
instance Ord a => P.Ord (WithPreludeOrd a) where
a<=b = a<=b
sort :: Ord a => [a] -> [a]
sort = map unWithPreludeOrd . L.sort . map WithPreludeOrd
shuffle :: (Eq a, MonadRandom m) => [a] -> m [a]
shuffle xs = do
let l = length xs
rands <- take l `liftM` getRandomRs (0, l1)
let ar = runSTArray ( do
ar <- Arr.thawSTArray (Arr.listArray (0, l1) xs)
forM_ (L.zip [0..(l1)] rands) $ \(i, j) -> do
vi <- Arr.readSTArray ar i
vj <- Arr.readSTArray ar j
Arr.writeSTArray ar j vi
Arr.writeSTArray ar i vj
return ar
)
return (Arr.elems ar)