Improve rule description
[sat-britney.git] / ZArray.hs
1 {-# LANGUAGE MagicHash, ScopedTypeVariables #-}
2 module ZArray where
3
4 import Data.Primitive.Types
5 import qualified Data.Primitive.ByteArray as PA
6 import Control.Monad
7 import Control.Monad.ST
8 import Data.Int
9 import Data.List
10 import Control.DeepSeq
11 import GHC.Exts
12
13 newtype Array = Array PA.ByteArray
14
15 instance NFData Array
16
17 fromList :: [Int32] -> Array
18 fromList l = Array $ runST $ do
19     ba <- PA.newByteArray (Prelude.length l * I# (sizeOf# (undefined :: Int32)))
20     forM_ (zip [0..] l) $ \(i,v) -> do
21         PA.writeByteArray ba i v
22     PA.unsafeFreezeByteArray ba
23
24 singleton :: Int32 -> Array
25 singleton x = Array $ runST $ do
26     ba <- PA.newByteArray (I# (sizeOf# (undefined :: Int32)))
27     PA.writeByteArray ba 0 x
28     PA.unsafeFreezeByteArray ba
29
30 toList :: Array -> [Int32]
31 toList (Array v) = [PA.indexByteArray v i | i <- [0..len-1]]
32   where len = PA.sizeofByteArray v `div` I# (sizeOf# (undefined :: Int32))
33 {-# INLINE toList #-}
34
35 unsafeIndex :: Int -> Array -> Int32
36 unsafeIndex i (Array v) = PA.indexByteArray v i
37 {-# INLINE unsafeIndex #-}
38
39 any :: (Int32 -> Bool) -> Array -> Bool
40 any p (Array v) = Prelude.any (\i -> p (PA.indexByteArray v i)) [0..len-1]
41   where len = PA.sizeofByteArray v `div` I# (sizeOf# (undefined :: Int32))
42
43 all :: (Int32 -> Bool) -> Array -> Bool
44 all p (Array v) = Prelude.all (\i -> p (PA.indexByteArray v i)) [0..len-1]
45   where len = PA.sizeofByteArray v `div` I# (sizeOf# (undefined :: Int32))
46
47 null :: Array -> Bool
48 null (Array v) = PA.sizeofByteArray v == 0
49
50 length :: Array -> Int
51 length (Array v) = PA.sizeofByteArray v `div` I# (sizeOf# (undefined :: Int32))
52
53 filter :: (Int32 -> Bool) -> Array -> Array
54 filter p v | ZArray.all p v = v
55            | otherwise = fromList (Prelude.filter p (toList v))
56
57 sort :: Array -> Array
58 sort v@(Array a) = if len <= 1 then v else fromList (Data.List.sort (toList v))
59   where len = PA.sizeofByteArray a `div` I# (sizeOf# (undefined :: Int32))
60
61 instance Eq Array where
62     v1 == v2 = toList v1 == toList v2
63 instance Ord Array where
64     v1 `compare` v2 = toList v1 `compare` toList v2
65 instance Show Array where
66     show v = "ZArray.fromList " ++ show (toList v)