26
26
27
27
module Data.Vector.Unboxed.Base (
28
28
MVector (.. ), IOVector , STVector , Vector (.. ), Unbox ,
29
- UnboxViaPrim (.. ), As (.. ), IsoUnbox (.. ),
29
+ UnboxViaPrim (.. ), UnboxViaStorable ( .. ), As (.. ), IsoUnbox (.. ),
30
30
DoNotUnboxLazy (.. ), DoNotUnboxNormalForm (.. ), DoNotUnboxStrict (.. )
31
31
) where
32
32
33
33
import qualified Data.Vector.Generic as G
34
34
import qualified Data.Vector.Generic.Mutable as M
35
35
import qualified Data.Vector as B
36
36
import qualified Data.Vector.Strict as S
37
+ import qualified Data.Vector.Storable as St
37
38
38
39
import qualified Data.Vector.Primitive as P
39
40
@@ -187,14 +188,14 @@ instance G.Vector Vector () where
187
188
-- >>>
188
189
-- >>> newtype Foo = Foo Int deriving VP.Prim
189
190
-- >>>
190
- -- >>> newtype instance VU.MVector s Foo = MV_Int (VP.MVector s Foo)
191
- -- >>> newtype instance VU.Vector Foo = V_Int (VP.Vector Foo)
191
+ -- >>> newtype instance VU.MVector s Foo = MV_Foo (VP.MVector s Foo)
192
+ -- >>> newtype instance VU.Vector Foo = V_Foo (VP.Vector Foo)
192
193
-- >>> deriving via (VU.UnboxViaPrim Foo) instance VGM.MVector VU.MVector Foo
193
194
-- >>> deriving via (VU.UnboxViaPrim Foo) instance VG.Vector VU.Vector Foo
194
195
-- >>> instance VU.Unbox Foo
195
196
--
196
197
-- Second example is essentially same but with a twist. Instead of
197
- -- using @ Prim@ instance of data type, we use underlying instance of @ Int@ :
198
+ -- using 'P. Prim' instance of data type, we use underlying instance of ' Int' :
198
199
--
199
200
-- >>> :set -XTypeFamilies -XStandaloneDeriving -XDerivingVia -XMultiParamTypeClasses
200
201
-- >>>
@@ -205,8 +206,8 @@ instance G.Vector Vector () where
205
206
-- >>>
206
207
-- >>> newtype Foo = Foo Int
207
208
-- >>>
208
- -- >>> newtype instance VU.MVector s Foo = MV_Int (VP.MVector s Int)
209
- -- >>> newtype instance VU.Vector Foo = V_Int (VP.Vector Int)
209
+ -- >>> newtype instance VU.MVector s Foo = MV_Foo (VP.MVector s Int)
210
+ -- >>> newtype instance VU.Vector Foo = V_Foo (VP.Vector Int)
210
211
-- >>> deriving via (VU.UnboxViaPrim Int) instance VGM.MVector VU.MVector Foo
211
212
-- >>> deriving via (VU.UnboxViaPrim Int) instance VG.Vector VU.Vector Foo
212
213
-- >>> instance VU.Unbox Foo
@@ -760,6 +761,102 @@ instance (Unbox a, Unbox b) => G.Vector Vector (Arg a b) where
760
761
elemseq _ (Arg x y) z = G. elemseq (undefined :: Vector a ) x
761
762
$ G. elemseq (undefined :: Vector b ) y z
762
763
764
+ -- -------
765
+ -- Unboxing the Storable values
766
+ -- -------
767
+
768
+ -- | Newtype wrapper which allows to derive unboxed vector in term of
769
+ -- storable vectors using @DerivingVia@ mechanism. This is mostly
770
+ -- used as illustration of use of @DerivingVia@ for vector, see examples below.
771
+ --
772
+ -- First is rather straightforward: we define newtype and use GND to
773
+ -- derive 'St.Storable' instance. Newtype instances should be defined
774
+ -- manually. Then we use deriving via to define necessary instances.
775
+ --
776
+ -- >>> :set -XTypeFamilies -XStandaloneDeriving -XDerivingVia -XMultiParamTypeClasses
777
+ -- >>> :set -XGeneralizedNewtypeDeriving
778
+ -- >>>
779
+ -- >>> import qualified Data.Vector.Generic as VG
780
+ -- >>> import qualified Data.Vector.Generic.Mutable as VGM
781
+ -- >>> import qualified Data.Vector.Storable as VS
782
+ -- >>> import qualified Data.Vector.Unboxed as VU
783
+ -- >>>
784
+ -- >>> newtype Foo = Foo Int deriving VS.Storable
785
+ -- >>>
786
+ -- >>> newtype instance VU.MVector s Foo = MV_Foo (VS.MVector s Foo)
787
+ -- >>> newtype instance VU.Vector Foo = V_Foo (VS.Vector Foo)
788
+ -- >>> deriving via (VU.UnboxViaStorable Foo) instance VGM.MVector VU.MVector Foo
789
+ -- >>> deriving via (VU.UnboxViaStorable Foo) instance VG.Vector VU.Vector Foo
790
+ -- >>> instance VU.Unbox Foo
791
+ --
792
+ -- Second example is essentially same but with a twist. Instead of
793
+ -- using 'St.Storable' instance of data type, we use underlying instance of 'Int':
794
+ --
795
+ -- >>> :set -XTypeFamilies -XStandaloneDeriving -XDerivingVia -XMultiParamTypeClasses
796
+ -- >>>
797
+ -- >>> import qualified Data.Vector.Generic as VG
798
+ -- >>> import qualified Data.Vector.Generic.Mutable as VGM
799
+ -- >>> import qualified Data.Vector.Storable as VS
800
+ -- >>> import qualified Data.Vector.Unboxed as VU
801
+ -- >>>
802
+ -- >>> newtype Foo = Foo Int
803
+ -- >>>
804
+ -- >>> newtype instance VU.MVector s Foo = MV_Foo (VS.MVector s Int)
805
+ -- >>> newtype instance VU.Vector Foo = V_Foo (VS.Vector Int)
806
+ -- >>> deriving via (VU.UnboxViaStorable Int) instance VGM.MVector VU.MVector Foo
807
+ -- >>> deriving via (VU.UnboxViaStorable Int) instance VG.Vector VU.Vector Foo
808
+ -- >>> instance VU.Unbox Foo
809
+ --
810
+ -- @since 0.13.3.0
811
+ newtype UnboxViaStorable a = UnboxViaStorable a
812
+
813
+ newtype instance MVector s (UnboxViaStorable a ) = MV_UnboxViaStorable (St. MVector s a )
814
+ newtype instance Vector (UnboxViaStorable a ) = V_UnboxViaStorable (St. Vector a )
815
+
816
+ instance St. Storable a => M. MVector MVector (UnboxViaStorable a ) where
817
+ {-# INLINE basicLength #-}
818
+ {-# INLINE basicUnsafeSlice #-}
819
+ {-# INLINE basicOverlaps #-}
820
+ {-# INLINE basicUnsafeNew #-}
821
+ {-# INLINE basicInitialize #-}
822
+ {-# INLINE basicUnsafeReplicate #-}
823
+ {-# INLINE basicUnsafeRead #-}
824
+ {-# INLINE basicUnsafeWrite #-}
825
+ {-# INLINE basicClear #-}
826
+ {-# INLINE basicSet #-}
827
+ {-# INLINE basicUnsafeCopy #-}
828
+ {-# INLINE basicUnsafeGrow #-}
829
+ basicLength = coerce $ M. basicLength @ St. MVector @ a
830
+ basicUnsafeSlice = coerce $ M. basicUnsafeSlice @ St. MVector @ a
831
+ basicOverlaps = coerce $ M. basicOverlaps @ St. MVector @ a
832
+ basicUnsafeNew = coerce $ M. basicUnsafeNew @ St. MVector @ a
833
+ basicInitialize = coerce $ M. basicInitialize @ St. MVector @ a
834
+ basicUnsafeReplicate = coerce $ M. basicUnsafeReplicate @ St. MVector @ a
835
+ basicUnsafeRead = coerce $ M. basicUnsafeRead @ St. MVector @ a
836
+ basicUnsafeWrite = coerce $ M. basicUnsafeWrite @ St. MVector @ a
837
+ basicClear = coerce $ M. basicClear @ St. MVector @ a
838
+ basicSet = coerce $ M. basicSet @ St. MVector @ a
839
+ basicUnsafeCopy = coerce $ M. basicUnsafeCopy @ St. MVector @ a
840
+ basicUnsafeMove = coerce $ M. basicUnsafeMove @ St. MVector @ a
841
+ basicUnsafeGrow = coerce $ M. basicUnsafeGrow @ St. MVector @ a
842
+
843
+ instance St. Storable a => G. Vector Vector (UnboxViaStorable a ) where
844
+ {-# INLINE basicUnsafeFreeze #-}
845
+ {-# INLINE basicUnsafeThaw #-}
846
+ {-# INLINE basicLength #-}
847
+ {-# INLINE basicUnsafeSlice #-}
848
+ {-# INLINE basicUnsafeIndexM #-}
849
+ {-# INLINE elemseq #-}
850
+ basicUnsafeFreeze = coerce $ G. basicUnsafeFreeze @ St. Vector @ a
851
+ basicUnsafeThaw = coerce $ G. basicUnsafeThaw @ St. Vector @ a
852
+ basicLength = coerce $ G. basicLength @ St. Vector @ a
853
+ basicUnsafeSlice = coerce $ G. basicUnsafeSlice @ St. Vector @ a
854
+ basicUnsafeIndexM = coerce $ G. basicUnsafeIndexM @ St. Vector @ a
855
+ basicUnsafeCopy = coerce $ G. basicUnsafeCopy @ St. Vector @ a
856
+ elemseq _ = seq
857
+
858
+ instance St. Storable a => Unbox (UnboxViaStorable a )
859
+
763
860
-- -------
764
861
-- Unboxing the boxed values
765
862
-- -------
@@ -777,7 +874,6 @@ instance (Unbox a, Unbox b) => G.Vector Vector (Arg a b) where
777
874
-- >>> :set -XTypeFamilies -XStandaloneDeriving -XDerivingVia
778
875
-- >>> :set -XMultiParamTypeClasses -XTypeOperators -XFlexibleInstances
779
876
-- >>> import qualified Data.Vector.Unboxed as VU
780
- -- >>> import qualified Data.Vector.Unboxed.Mutable as VUM
781
877
-- >>> import qualified Data.Vector.Generic as VG
782
878
-- >>> import qualified Data.Vector.Generic.Mutable as VGM
783
879
-- >>> :{
@@ -790,7 +886,7 @@ instance (Unbox a, Unbox b) => G.Vector Vector (Arg a b) where
790
886
-- >>> {-# INLINE fromURepr #-}
791
887
-- >>> newtype instance VU.MVector s (Foo a) = MV_Foo (VU.MVector s (Int, VU.DoNotUnboxLazy a))
792
888
-- >>> newtype instance VU.Vector (Foo a) = V_Foo (VU.Vector (Int, VU.DoNotUnboxLazy a))
793
- -- >>> deriving via (Foo a `VU.As` (Int, VU.DoNotUnboxLazy a)) instance VGM.MVector VUM .MVector (Foo a)
889
+ -- >>> deriving via (Foo a `VU.As` (Int, VU.DoNotUnboxLazy a)) instance VGM.MVector VU .MVector (Foo a)
794
890
-- >>> deriving via (Foo a `VU.As` (Int, VU.DoNotUnboxLazy a)) instance VG.Vector VU.Vector (Foo a)
795
891
-- >>> instance VU.Unbox (Foo a)
796
892
-- >>> :}
@@ -862,7 +958,6 @@ instance Unbox (DoNotUnboxLazy a)
862
958
-- >>> :set -XBangPatterns -XTypeFamilies -XStandaloneDeriving -XDerivingVia
863
959
-- >>> :set -XMultiParamTypeClasses -XTypeOperators -XFlexibleInstances
864
960
-- >>> import qualified Data.Vector.Unboxed as VU
865
- -- >>> import qualified Data.Vector.Unboxed.Mutable as VUM
866
961
-- >>> import qualified Data.Vector.Generic as VG
867
962
-- >>> import qualified Data.Vector.Generic.Mutable as VGM
868
963
-- >>> :{
@@ -875,7 +970,7 @@ instance Unbox (DoNotUnboxLazy a)
875
970
-- >>> {-# INLINE fromURepr #-}
876
971
-- >>> newtype instance VU.MVector s (Bar a) = MV_Bar (VU.MVector s (Int, VU.DoNotUnboxStrict a))
877
972
-- >>> newtype instance VU.Vector (Bar a) = V_Bar (VU.Vector (Int, VU.DoNotUnboxStrict a))
878
- -- >>> deriving via (Bar a `VU.As` (Int, VU.DoNotUnboxStrict a)) instance VGM.MVector VUM .MVector (Bar a)
973
+ -- >>> deriving via (Bar a `VU.As` (Int, VU.DoNotUnboxStrict a)) instance VGM.MVector VU .MVector (Bar a)
879
974
-- >>> deriving via (Bar a `VU.As` (Int, VU.DoNotUnboxStrict a)) instance VG.Vector VU.Vector (Bar a)
880
975
-- >>> instance VU.Unbox (Bar a)
881
976
-- >>> :}
@@ -947,7 +1042,6 @@ instance Unbox (DoNotUnboxStrict a)
947
1042
-- >>> :set -XTypeFamilies -XStandaloneDeriving -XDerivingVia
948
1043
-- >>> :set -XMultiParamTypeClasses -XTypeOperators -XFlexibleInstances
949
1044
-- >>> import qualified Data.Vector.Unboxed as VU
950
- -- >>> import qualified Data.Vector.Unboxed.Mutable as VUM
951
1045
-- >>> import qualified Data.Vector.Generic as VG
952
1046
-- >>> import qualified Data.Vector.Generic.Mutable as VGM
953
1047
-- >>> import qualified Control.DeepSeq as NF
@@ -961,7 +1055,7 @@ instance Unbox (DoNotUnboxStrict a)
961
1055
-- >>> {-# INLINE fromURepr #-}
962
1056
-- >>> newtype instance VU.MVector s (Baz a) = MV_Baz (VU.MVector s (Int, VU.DoNotUnboxNormalForm a))
963
1057
-- >>> newtype instance VU.Vector (Baz a) = V_Baz (VU.Vector (Int, VU.DoNotUnboxNormalForm a))
964
- -- >>> deriving via (Baz a `VU.As` (Int, VU.DoNotUnboxNormalForm a)) instance NF.NFData a => VGM.MVector VUM .MVector (Baz a)
1058
+ -- >>> deriving via (Baz a `VU.As` (Int, VU.DoNotUnboxNormalForm a)) instance NF.NFData a => VGM.MVector VU .MVector (Baz a)
965
1059
-- >>> deriving via (Baz a `VU.As` (Int, VU.DoNotUnboxNormalForm a)) instance NF.NFData a => VG.Vector VU.Vector (Baz a)
966
1060
-- >>> instance NF.NFData a => VU.Unbox (Baz a)
967
1061
-- >>> :}
0 commit comments