@@ -1,27 +1,33 @@
1{-# OPTIONS_GHC -fno-warn-orphans #-}
1{-# OPTIONS_GHC -fno-warn-orphans #-}
3{-# LANGUAGE ExplicitForAll #-}
3{-# LANGUAGE ExplicitForAll #-}
4{-# LANGUAGE KindSignatures #-}
5{-# LANGUAGE KindSignatures #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE PolyKinds #-}
7{-# LANGUAGE PolyKinds #-}
8+{-# LANGUAGE RankNTypes #-}
7{-# LANGUAGE ScopedTypeVariables #-}
9{-# LANGUAGE ScopedTypeVariables #-}
8{-# LANGUAGE TypeFamilies #-}
10{-# LANGUAGE TypeFamilies #-}
11module Data.TypeRep.Vector
13module Data.TypeRep.Vector
12 ( TypeRepVector (..)
14 ( TypeRepVector (..)
19import Prelude hiding (lookup)
23import Prelude hiding (lookup)
25+import Control.Arrow ((&&&))
21import Data.Proxy (Proxy (..))
26import Data.Proxy (Proxy (..))
22import Data.Typeable (Typeable, typeRep, typeRepFingerprint)
27import Data.Typeable (Typeable, typeRep, typeRepFingerprint)
23import Data.Word (Word64)
28import Data.Word (Word64)
24import GHC.Base (Any)
29import GHC.Base (Any)
30+import GHC.Exts (sortWith)
25import GHC.Fingerprint (Fingerprint (..))
31import GHC.Fingerprint (Fingerprint (..))
26import Unsafe.Coerce (unsafeCoerce)
32import Unsafe.Coerce (unsafeCoerce)
@@ -30,105 +36,90 @@ import qualified Data.Vector.Generic as G
30import qualified Data.Vector.Generic.Mutable as M
36import qualified Data.Vector.Generic.Mutable as M
31import qualified Data.Vector.Unboxed as Unboxed
37import qualified Data.Vector.Unboxed as Unboxed
33−data instance Unboxed.MVector s Fingerprint = MFingerprintVector !Int (Unboxed.MVector s Word64) (Unboxed.MVector s Word64)
39+data instance Unboxed.MVector s Fingerprint = MFingerprintVector (Unboxed.MVector s Word64) (Unboxed.MVector s Word64)
34−data instance Unboxed.Vector Fingerprint = FingerprintVector !Int (Unboxed.Vector Word64) (Unboxed.Vector Word64)
40+data instance Unboxed.Vector Fingerprint = FingerprintVector (Unboxed.Vector Word64) (Unboxed.Vector Word64)
36instance Unboxed.Unbox Fingerprint
42instance Unboxed.Unbox Fingerprint
38instance M.MVector Unboxed.MVector Fingerprint where
44instance M.MVector Unboxed.MVector Fingerprint where
39 {-# INLINE basicLength #-}
45 {-# INLINE basicLength #-}
40− basicLength (MFingerprintVector n _ _) = n
46+ basicLength (MFingerprintVector x _) = M.basicLength x
41 {-# INLINE basicUnsafeSlice #-}
47 {-# INLINE basicUnsafeSlice #-}
42− basicUnsafeSlice i m (MFingerprintVector _ a b) =
48+ basicUnsafeSlice i m (MFingerprintVector a b) =
43− MFingerprintVector m (M.basicUnsafeSlice i m a) (M.basicUnsafeSlice i m b)
49+ MFingerprintVector (M.basicUnsafeSlice i m a) (M.basicUnsafeSlice i m b)
44 {-# INLINE basicOverlaps #-}
50 {-# INLINE basicOverlaps #-}
45− basicOverlaps (MFingerprintVector _ as1 bs1) (MFingerprintVector _ as2 bs2) =
51+ basicOverlaps (MFingerprintVector as1 bs1) (MFingerprintVector as2 bs2) =
46 M.basicOverlaps as1 as2 || M.basicOverlaps bs1 bs2
52 M.basicOverlaps as1 as2 || M.basicOverlaps bs1 bs2
47 {-# INLINE basicUnsafeNew #-}
53 {-# INLINE basicUnsafeNew #-}
48− basicUnsafeNew n_
54+ basicUnsafeNew n_ = do
50− as <- M.basicUnsafeNew n_
55+ as <- M.basicUnsafeNew n_
51− bs <- M.basicUnsafeNew n_
56+ bs <- M.basicUnsafeNew n_
52− return $ MFingerprintVector n_ as bs
57+ return $ MFingerprintVector as bs
53 {-# INLINE basicInitialize #-}
58 {-# INLINE basicInitialize #-}
54− basicInitialize (MFingerprintVector _ as bs)
59+ basicInitialize (MFingerprintVector as bs) = do
56− M.basicInitialize as
60+ M.basicInitialize as
57− M.basicInitialize bs
61+ M.basicInitialize bs
58 {-# INLINE basicUnsafeReplicate #-}
62 {-# INLINE basicUnsafeReplicate #-}
59− basicUnsafeReplicate n_ (Fingerprint a b)
63+ basicUnsafeReplicate n_ (Fingerprint a b) = do
61− as <- M.basicUnsafeReplicate n_ a
64+ as <- M.basicUnsafeReplicate n_ a
62− bs <- M.basicUnsafeReplicate n_ b
65+ bs <- M.basicUnsafeReplicate n_ b
63− return $ MFingerprintVector n_ as bs
66+ return $ MFingerprintVector as bs
64 {-# INLINE basicUnsafeRead #-}
67 {-# INLINE basicUnsafeRead #-}
65− basicUnsafeRead (MFingerprintVector _ as bs) i_
68+ basicUnsafeRead (MFingerprintVector as bs) i_ = do
67− a <- M.basicUnsafeRead as i_
69+ a <- M.basicUnsafeRead as i_
68− b <- M.basicUnsafeRead bs i_
70+ b <- M.basicUnsafeRead bs i_
69− return (Fingerprint a b)
71+ return (Fingerprint a b)
70 {-# INLINE basicUnsafeWrite #-}
72 {-# INLINE basicUnsafeWrite #-}
71− basicUnsafeWrite (MFingerprintVector _ as bs) i_ (Fingerprint a b)
73+ basicUnsafeWrite (MFingerprintVector as bs) i_ (Fingerprint a b) = do
73− M.basicUnsafeWrite as i_ a
74+ M.basicUnsafeWrite as i_ a
74− M.basicUnsafeWrite bs i_ b
75+ M.basicUnsafeWrite bs i_ b
75 {-# INLINE basicClear #-}
76 {-# INLINE basicClear #-}
76− basicClear (MFingerprintVector _ as bs)
77+ basicClear (MFingerprintVector as bs) = do
78− M.basicClear as
78+ M.basicClear as
79− M.basicClear bs
79+ M.basicClear bs
80 {-# INLINE basicSet #-}
80 {-# INLINE basicSet #-}
81− basicSet (MFingerprintVector _ as bs) (Fingerprint a b)
81+ basicSet (MFingerprintVector as bs) (Fingerprint a b) = do
83− M.basicSet as a
82+ M.basicSet as a
84− M.basicSet bs b
83+ M.basicSet bs b
85 {-# INLINE basicUnsafeCopy #-}
84 {-# INLINE basicUnsafeCopy #-}
86− basicUnsafeCopy (MFingerprintVector _ as1 bs1) (MFingerprintVector _ as2 bs2)
85+ basicUnsafeCopy (MFingerprintVector as1 bs1) (MFingerprintVector as2 bs2) = do
88− M.basicUnsafeCopy as1 as2
86+ M.basicUnsafeCopy as1 as2
89− M.basicUnsafeCopy bs1 bs2
87+ M.basicUnsafeCopy bs1 bs2
90 {-# INLINE basicUnsafeMove #-}
88 {-# INLINE basicUnsafeMove #-}
91− basicUnsafeMove (MFingerprintVector _ as1 bs1) (MFingerprintVector _ as2 bs2)
89+ basicUnsafeMove (MFingerprintVector as1 bs1) (MFingerprintVector as2 bs2) = do
93− M.basicUnsafeMove as1 as2
90+ M.basicUnsafeMove as1 as2
94− M.basicUnsafeMove bs1 bs2
91+ M.basicUnsafeMove bs1 bs2
95 {-# INLINE basicUnsafeGrow #-}
92 {-# INLINE basicUnsafeGrow #-}
96− basicUnsafeGrow (MFingerprintVector n_ as bs) m_
93+ basicUnsafeGrow (MFingerprintVector as bs) m_ = do
98− as' <- M.basicUnsafeGrow as m_
94+ as' <- M.basicUnsafeGrow as m_
99− bs' <- M.basicUnsafeGrow bs m_
95+ bs' <- M.basicUnsafeGrow bs m_
100− return $ MFingerprintVector (m_ + n_) as' bs'
96+ return $ MFingerprintVector as' bs'
102instance G.Vector Unboxed.Vector Fingerprint where
98instance G.Vector Unboxed.Vector Fingerprint where
103 {-# INLINE basicUnsafeFreeze #-}
99 {-# INLINE basicUnsafeFreeze #-}
104− basicUnsafeFreeze (MFingerprintVector n_ as bs)
100+ basicUnsafeFreeze (MFingerprintVector as bs) = do
106− as' <- G.basicUnsafeFreeze as
101+ as' <- G.basicUnsafeFreeze as
107− bs' <- G.basicUnsafeFreeze bs
102+ bs' <- G.basicUnsafeFreeze bs
108− return $ FingerprintVector n_ as' bs'
103+ return $ FingerprintVector as' bs'
109 {-# INLINE basicUnsafeThaw #-}
104 {-# INLINE basicUnsafeThaw #-}
110− basicUnsafeThaw (FingerprintVector n_ as bs)
105+ basicUnsafeThaw (FingerprintVector as bs) = do
112− as' <- G.basicUnsafeThaw as
106+ as' <- G.basicUnsafeThaw as
113− bs' <- G.basicUnsafeThaw bs
107+ bs' <- G.basicUnsafeThaw bs
114− return $ MFingerprintVector n_ as' bs'
108+ return $ MFingerprintVector as' bs'
115 {-# INLINE basicLength #-}
109 {-# INLINE basicLength #-}
116− basicLength (FingerprintVector n_ _ _) = n_
110+ basicLength (FingerprintVector x _) = G.basicLength x
117 {-# INLINE basicUnsafeSlice #-}
111 {-# INLINE basicUnsafeSlice #-}
118− basicUnsafeSlice i_ m_ (FingerprintVector _ as bs)
112+ basicUnsafeSlice i_ m_ (FingerprintVector as bs) =
119− = FingerprintVector m_ (G.basicUnsafeSlice i_ m_ as)
113+ FingerprintVector (G.basicUnsafeSlice i_ m_ as) (G.basicUnsafeSlice i_ m_ bs)
120− (G.basicUnsafeSlice i_ m_ bs)
121 {-# INLINE basicUnsafeIndexM #-}
114 {-# INLINE basicUnsafeIndexM #-}
122− basicUnsafeIndexM (FingerprintVector _ as bs) i_
115+ basicUnsafeIndexM (FingerprintVector as bs) i_ = do
124− a <- G.basicUnsafeIndexM as i_
116+ a <- G.basicUnsafeIndexM as i_
125− b <- G.basicUnsafeIndexM bs i_
117+ b <- G.basicUnsafeIndexM bs i_
126− return (Fingerprint a b)
118+ return (Fingerprint a b)
127 {-# INLINE basicUnsafeCopy #-}
119 {-# INLINE basicUnsafeCopy #-}
128− basicUnsafeCopy (MFingerprintVector _ as1 bs1) (FingerprintVector _ as2 bs2)
120+ basicUnsafeCopy (MFingerprintVector as1 bs1) (FingerprintVector as2 bs2) = do
130− G.basicUnsafeCopy as1 as2
121+ G.basicUnsafeCopy as1 as2
131− G.basicUnsafeCopy bs1 bs2
122+ G.basicUnsafeCopy bs1 bs2
132 {-# INLINE elemseq #-}
123 {-# INLINE elemseq #-}
133 elemseq _ (Fingerprint a b)
124 elemseq _ (Fingerprint a b)
134 = G.elemseq (undefined :: Unboxed.Vector a) a
125 = G.elemseq (undefined :: Unboxed.Vector a) a
@@ -153,7 +144,7 @@ insert = undefined
153-- | Looks up the value at the type.
144-- | Looks up the value at the type.
154-- >>> let x = lookup $ insert (11 :: Int) empty
145-- >>> let x = lookup $ insert (11 :: Int) empty
155-- >>> x :: Maybe Int
146-- >>> x :: Maybe Int
156−-- Just 11
147+-- Just 11a Ty
157-- >>> x :: Maybe ()
148-- >>> x :: Maybe ()
158-- Nothing
149-- Nothing
159lookup :: forall a f . Typeable a => TypeRepVector f -> Maybe (f a)
150lookup :: forall a f . Typeable a => TypeRepVector f -> Maybe (f a)
@@ -164,6 +155,23 @@ lookup tVect = fromAny . (anys tVect V.!)
164size :: TypeRepVector f -> Int
155size :: TypeRepVector f -> Int
165size = Unboxed.length . fingerprints
156size = Unboxed.length . fingerprints
159+ TF :: Typeable a => f a -> TF f
161+fromF :: Typeable a => f a -> Proxy a
164+fromList :: forall f . [TF f] -> TypeRepVector f
165+fromList tfs = TypeRepVect (Unboxed.fromList fps) (V.fromList ans)
167+ (fps, ans) = unzip $ sortWith fst $ map (fp &&& an) tfs
169+ fp :: TF f -> Fingerprint
170+ fp (TF x) = typeRepFingerprint $ typeRep $ fromF x
173+ an (TF x) = unsafeCoerce x
167-- | Returns the index is found.
175-- | Returns the index is found.
168binarySearch :: Fingerprint -> Unboxed.Vector Fingerprint -> Maybe Int
176binarySearch :: Fingerprint -> Unboxed.Vector Fingerprint -> Maybe Int
169binarySearch fp fpVect =
177binarySearch fp fpVect =