Resolve conflict
[darcs-mirrors/vector.git] / internal / GenUnboxTuple.hs
index 0f4b72a..633e7f1 100644 (file)
@@ -27,6 +27,7 @@ generate n =
        , text "#endif"
        , text "#ifdef DEFINE_IMMUTABLE"
        , define_zip "Vector" "V"
+       , define_zip_rule
        , define_unzip "Vector" "V"
        , text "#endif"
        ]
@@ -43,7 +44,7 @@ generate n =
       = hang (hsep [text "data instance", text ty, tuple vars])
              4
              (hsep [char '=', con c, text "{-# UNPACK #-} !Int"
-                   , vcat $ map (\v -> parens (text ty <+> v)) vars])
+                   , vcat $ map (\v -> char '!' <> parens (text ty <+> v)) vars])
 
     class_instance cls
       = text "instance" <+> vtuple [text "Unbox" <+> v | v <- vars]
@@ -51,44 +52,49 @@ generate n =
 
 
     define_zip ty c
-      = sep [name <+> text "::"
+      = sep [text "-- | /O(1)/ Zip" <+> int n <+> text "vectors"
+            ,name <+> text "::"
                   <+> vtuple [text "Unbox" <+> v | v <- vars]
                   <+> text "=>"
                   <+> sep (punctuate (text " ->") [text ty <+> v | v <- vars])
                   <+> text "->"
                   <+> text ty <+> tuple vars
-             ,text "{-# INLINE_STREAM"  <+> name <+> text "#-}"
+             ,text "{-# INLINE_FUSED"  <+> name <+> text "#-}"
              ,name <+> sep varss
                    <+> text "="
                    <+> con c
                    <+> text "len"
                    <+> sep [parens $ text "unsafeSlice"
-                                     <+> vs
                                      <+> char '0'
-                                     <+> text "len" | vs <- varss]
+                                     <+> text "len"
+                                     <+> vs | vs <- varss]
              ,nest 2 $ hang (text "where")
                             2
                      $ text "len ="
-                       <+> sep (punctuate (text " `min`")
+                       <+> sep (punctuate (text " `delayed_min`")
                                           [text "length" <+> vs | vs <- varss])
-             ,hang (text "{-# RULES" <+> text "\"stream/" <> name
-                     <> text "\" forall" <+> sep varss <+> char '.')
-                   2 $
-                   text "G.stream" <+> parens (name <+> sep varss)
-                   <+> char '='
-                   <+> text "Stream." <> zw <+> tuple (replicate n empty)
-                   <+> sep [parens $ text "G.stream" <+> vs | vs <- varss]
-                   $$ text "#-}"
              ]
       where
         name | n == 2    = text "zip"
              | otherwise = text "zip" <> int n
 
-        zw | n == 2    = text "zipWith"
-           | otherwise = text "zipWith" <> int n
+    define_zip_rule
+      = hang (text "{-# RULES" <+> text "\"stream/" <> name "zip"
+              <> text " [Vector.Unboxed]\" forall" <+> sep varss <+> char '.')
+             2 $
+             text "G.stream" <+> parens (name "zip" <+> sep varss)
+             <+> char '='
+             <+> text "Bundle." <> name "zipWith" <+> tuple (replicate n empty)
+             <+> sep [parens $ text "G.stream" <+> vs | vs <- varss]
+             $$ text "#-}"
+     where
+       name s | n == 2    = text s
+              | otherwise = text s <> int n
+       
 
     define_unzip ty c
-      = sep [name <+> text "::"
+      = sep [text "-- | /O(1)/ Unzip" <+> int n <+> text "vectors"
+            ,name <+> text "::"
                   <+> vtuple [text "Unbox" <+> v | v <- vars]
                   <+> text "=>"
                   <+> text ty <+> tuple vars
@@ -111,11 +117,11 @@ generate n =
     gen_length c _ = (pat c, var 'n')
 
     gen_unsafeSlice mod c rec
-      = (pat c <+> var 'i' <+> var 'm',
+      = (var 'i' <+> var 'm' <+> pat c,
          con c <+> var 'm'
                <+> vcat [parens
                          $ text mod <> char '.' <> text rec
-                                    <+> vs <+> var 'i' <+> var 'm'
+                                    <+> var 'i' <+> var 'm' <+> vs
                                         | vs <- varss])
 
 
@@ -129,7 +135,7 @@ generate n =
          mk_do [v <+> text "<-" <+> qM rec <+> var 'n' | v <- varss]
                $ text "return $" <+> con "MV" <+> var 'n' <+> sep varss)
 
-    gen_unsafeNewWith rec
+    gen_unsafeReplicate rec
       = (var 'n' <+> tuple vars,
          mk_do [vs <+> text "<-" <+> qM rec <+> var 'n' <+> v
                         | v  <- vars | vs <- varss]
@@ -153,17 +159,23 @@ generate n =
       = (pat "MV" <+> tuple vars,
          mk_do [qM rec <+> vs <+> v | vs <- varss | v <- vars] empty)
 
-    gen_unsafeCopy rec
+    gen_unsafeCopy c q rec
+      = (patn "MV" 1 <+> patn c 2,
+         mk_do [q rec <+> vs <> char '1' <+> vs <> char '2' | vs <- varss]
+               empty)
+
+    gen_unsafeMove rec
       = (patn "MV" 1 <+> patn "MV" 2,
          mk_do [qM rec <+> vs <> char '1' <+> vs <> char '2' | vs <- varss]
                empty)
 
     gen_unsafeGrow rec
       = (pat "MV" <+> var 'm',
-         mk_do [qM rec <+> vs <+> var 'm' | vs <- varss]
+         mk_do [vs <> char '\'' <+> text "<-"
+                                <+> qM rec <+> vs <+> var 'm' | vs <- varss]
                $ text "return $" <+> con "MV"
                                  <+> parens (var 'm' <> char '+' <> var 'n')
-                                 <+> sep varss)
+                                 <+> sep (map (<> char '\'') varss))
 
     gen_unsafeFreeze rec
       = (pat "MV",
@@ -171,14 +183,24 @@ generate n =
                $ text "return $" <+> con "V" <+> var 'n'
                                  <+> sep [vs <> char '\'' | vs <- varss])
 
+    gen_unsafeThaw rec
+      = (pat "V",
+         mk_do [vs <> char '\'' <+> text "<-" <+> qG rec <+> vs | vs <- varss]
+               $ text "return $" <+> con "MV" <+> var 'n'
+                                 <+> sep [vs <> char '\'' | vs <- varss])
+
     gen_basicUnsafeIndexM rec
       = (pat "V" <+> var 'i',
          mk_do [v <+> text "<-" <+> qG rec <+> vs <+> var 'i'
                         | vs <- varss | v <- vars]
                $ text "return" <+> tuple vars)
 
-    
-         
+    gen_elemseq rec
+      = (char '_' <+> tuple vars,
+         vcat $ r : [char '.' <+> r | r <- rs])
+      where
+        r : rs = [qG rec <+> parens (text "undefined :: Vector" <+> v)
+                         <+> v | v <- vars]
 
     mk_do cmds ret = hang (text "do")
                           2
@@ -195,15 +217,19 @@ generate n =
                       ,("basicUnsafeSlice",       gen_unsafeSlice "M" "MV")
                       ,("basicOverlaps",          gen_overlaps)
                       ,("basicUnsafeNew",         gen_unsafeNew)
-                      ,("basicUnsafeNewWith",     gen_unsafeNewWith)
+                      ,("basicUnsafeReplicate",   gen_unsafeReplicate)
                       ,("basicUnsafeRead",        gen_unsafeRead)
                       ,("basicUnsafeWrite",       gen_unsafeWrite)
                       ,("basicClear",             gen_clear)
                       ,("basicSet",               gen_set)
-                      ,("basicUnsafeCopy",        gen_unsafeCopy)
+                      ,("basicUnsafeCopy",        gen_unsafeCopy "MV" qM)
+                      ,("basicUnsafeMove",        gen_unsafeMove)
                       ,("basicUnsafeGrow",        gen_unsafeGrow)]
 
-    methods_Vector  = [("unsafeFreeze",           gen_unsafeFreeze)
+    methods_Vector  = [("basicUnsafeFreeze",      gen_unsafeFreeze)
+                      ,("basicUnsafeThaw",        gen_unsafeThaw)
                       ,("basicLength",            gen_length "V")
                       ,("basicUnsafeSlice",       gen_unsafeSlice "G" "V")
-                      ,("basicUnsafeIndexM",      gen_basicUnsafeIndexM)]
+                      ,("basicUnsafeIndexM",      gen_basicUnsafeIndexM)
+                      ,("basicUnsafeCopy",        gen_unsafeCopy "V" qG)
+                      ,("elemseq",                gen_elemseq)]