ptr 0.16.7 → 0.16.7.1
raw patch · 5 files changed
+37/−5 lines, 5 files
Files
- library/Ptr/List.hs +13/−0
- library/Ptr/PokeIO.hs +12/−0
- library/Ptr/Poking.hs +4/−3
- ptr.cabal +2/−1
- tests/Main.hs +6/−1
+ library/Ptr/List.hs view
@@ -0,0 +1,13 @@+module Ptr.List+where++import Ptr.Prelude+++{-# INLINE reverseDigits #-}+reverseDigits :: Integral a => a {-^ Radix -} -> a {-^ Number -} -> [a]+reverseDigits radix =+ let+ loop x = case divMod x radix of+ (next, digit) -> digit : if next <= 0 then [] else loop next+ in loop
library/Ptr/PokeIO.hs view
@@ -38,3 +38,15 @@ 0 -> return () _ -> loop (plusPtr ptr (-1)) quot in \ lastIndex x ptr -> loop (plusPtr ptr lastIndex) x++{-# INLINE reverseAsciiDigits #-}+reverseAsciiDigits :: (Integral a) => Int -> [a] -> PokeIO+reverseAsciiDigits index elements ptr =+ let+ loop ptr =+ \ case+ digit : tail -> do+ IO.pokeWord8 ptr (48 + fromIntegral digit)+ loop (plusPtr ptr (-1)) tail+ _ -> return ()+ in loop (plusPtr ptr index) elements
library/Ptr/Poking.hs view
@@ -6,6 +6,7 @@ import qualified Ptr.Poke as C import qualified Ptr.PokeAndPeek as D import qualified Ptr.PokeIO as E+import qualified Ptr.List as List import qualified Data.ByteString.Internal as B import qualified Data.Vector as F import qualified Data.Vector.Generic as GenericVector@@ -118,9 +119,9 @@ asciiIntegral = \ case 0 -> word8 48 x -> let- lastIndex = (floor . logBase 10 . fromIntegral) x- size = succ lastIndex- action = E.asciiUnsignedIntegral lastIndex x+ reverseDigits = List.reverseDigits 10 x+ size = List.length reverseDigits+ action = E.reverseAsciiDigits (pred size) reverseDigits in Poking size action {-# INLINE asciiChar #-}
ptr.cabal view
@@ -1,5 +1,5 @@ name: ptr-version: 0.16.7+version: 0.16.7.1 category: Ptr, Data synopsis: Abstractions for operations on pointers homepage: https://github.com/nikita-volkov/ptr@@ -35,6 +35,7 @@ Ptr.Prelude Ptr.Receive.Core Ptr.UncheckedShifting+ Ptr.List build-depends: base >=4.9 && <5, bytestring >=0.10 && <0.11,
tests/Main.hs view
@@ -43,7 +43,7 @@ assertEqual "" "000" (A.poking (F.asciiPaddedAndTrimmedIntegral 3 (-1))) , testCase "asciiUtcTimeInIso8601" $ do- assertEqual "" "2017-02-01T05:03:58Z" (A.poking (F.asciiUtcTimeInIso8601 (read "2017-02-01 05:03:58")))+ assertEqual "" "2017-02-01T05:03:58Z" (A.poking (F.asciiUtcTimeInIso8601 (read "2017-02-01 05:03:58Z"))) , testCase "fromString" $ do assertEqual "" "123" (A.poking "123")@@ -53,6 +53,11 @@ ] , parsing+ ,+ testGroup "Regression" [+ testCase "https://github.com/nikita-volkov/hasql-dynamic-statements/issues/2" $+ assertEqual "" "$1000" (A.poking (F.word8 36 <> F.asciiIntegral 1000))+ ] ] parsing :: TestTree