ulid 0.3.0.0 → 0.3.2.0
raw patch · 6 files changed
+26/−19 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.ULID: instance GHC.Generics.Generic Data.ULID.ULID
+ Data.ULID.Random: instance GHC.Generics.Generic Data.ULID.Random.ULIDRandom
+ Data.ULID.TimeStamp: instance GHC.Generics.Generic Data.ULID.TimeStamp.ULIDTimeStamp
Files
- src/Data/ULID.hs +8/−6
- src/Data/ULID/Base32.hs +1/−1
- src/Data/ULID/Random.hs +9/−7
- src/Data/ULID/TimeStamp.hs +6/−4
- test/Data/ULIDSpec.hs +1/−0
- ulid.cabal +1/−1
src/Data/ULID.hs view
@@ -27,6 +27,7 @@ -} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-} module Data.ULID ( ULID(..), getULIDTime,@@ -43,6 +44,7 @@ import Data.Monoid ((<>)) import Data.Text as T import Data.Time.Clock.POSIX+import GHC.Generics import System.IO.Unsafe import qualified System.Random as R @@ -60,13 +62,13 @@ { timeStamp :: !ULIDTimeStamp , random :: !ULIDRandom }- deriving (Eq, Typeable, Data)+ deriving (Eq, Typeable, Data, Generic) instance Ord ULID where compare (ULID ts1 _) (ULID ts2 _) = compare ts1 ts2 instance Show ULID where- show (ULID ts bytes) = (show ts) ++ (show bytes)+ show (ULID ts bytes) = show ts ++ show bytes instance Read ULID where readsPrec _ str = do@@ -87,7 +89,7 @@ -- but since the work to put it here has already been done -- it's no harm to leave it in. instance NFData ULID where- rnf (ULID ts bytes) = rnf ts `seq` (rnf bytes `seq` ())+ rnf (ULID ts bytes) = rnf ts `seq` rnf bytes instance R.Random ULID where randomR _ = R.random -- ignore range@@ -95,7 +97,6 @@ t <- getULIDTimeStamp let (r, g') = mkULIDRandom g return (ULID t r, g')- randomIO = getULID instance Hashable ULID where hashWithSalt salt ulid = hashWithSalt salt (encode ulid)@@ -126,7 +127,8 @@ -- than storing the shown `Text`, -- but still human-readable unlike the Binary version. ulidToInteger :: ULID -> Integer-ulidToInteger = roll.(LBS.unpack).encode+ulidToInteger =+ roll . LBS.unpack . encode -- | Convert a ULID from its corresponding 128-bit Integer.@@ -138,7 +140,7 @@ | n > maxValidInteger = Left "Value must not be larger than the maximum safe Integer size (128 bits)" | otherwise = Right- . decode . LBS.pack . (unroll 16) $ n -- 16 bytes = 128 bit+ . decode . LBS.pack . unroll 16 $ n -- 16 bytes = 128 bit where maxValidInteger :: Integer maxValidInteger = (2 ^ 128) - 1
src/Data/ULID/Base32.hs view
@@ -137,7 +137,7 @@ -> i -- ^ Natural number to encode -> Text -- ^ 0 padded, Douglas Crockford's base 32 encoded Text encode width =- (leftpad $ clampZero width) . encodePlain . clampZero+ leftpad (clampZero width) . encodePlain . clampZero -- | >>> decode 5 "0003V"
src/Data/ULID/Random.hs view
@@ -2,6 +2,7 @@ -- either with PRNGs or TRNGs. {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-} module Data.ULID.Random ( ULIDRandom, mkCryptoULIDRandom,@@ -19,6 +20,7 @@ import Data.Maybe import Data.Word import Data.Text as T hiding (split, take)+import GHC.Generics import System.Random @@ -27,21 +29,21 @@ -- | Newtype wrapping a `ByteString` newtype ULIDRandom = ULIDRandom BS.ByteString- deriving (Eq, Typeable, Data)+ deriving (Eq, Typeable, Data, Generic) instance Show ULIDRandom where- show (ULIDRandom r) = T.unpack $ B32.encode 16.roll.(BS.unpack) $ r+ show (ULIDRandom r) = T.unpack $ B32.encode 16 . roll . BS.unpack $ r instance Read ULIDRandom where readsPrec _ = fmap (\(int, rest) -> (ULIDRandom $ BS.pack $ unroll numBytes int, T.unpack rest))- . (B32.decode $ 16)+ . B32.decode 16 . T.pack instance Binary ULIDRandom where- put (ULIDRandom r) = mapM_ put (BS.unpack $ r)- get = ULIDRandom <$> (BS.pack) <$> replicateM numBytes get+ put (ULIDRandom r) = mapM_ put (BS.unpack r)+ get = ULIDRandom . BS.pack <$> replicateM numBytes get instance NFData ULIDRandom where rnf (ULIDRandom r) = rnf r@@ -66,7 +68,7 @@ mkULIDRandom :: RandomGen g => g -> (ULIDRandom, g) mkULIDRandom g = let (g1, g2) = split g- genbytes = (BS.pack) . take numBytes . randoms+ genbytes = BS.pack . take numBytes . randoms in (ULIDRandom $ genbytes g, g2) @@ -75,4 +77,4 @@ -- | Note: The call to `newStdGen` splits the generator, -- so this is safe to call multiple times getULIDRandom =- fst <$> mkULIDRandom <$> newStdGen+ fst . mkULIDRandom <$> newStdGen
src/Data/ULID/TimeStamp.hs view
@@ -1,6 +1,7 @@ -- | Custom data type for timestamps (milliseconds since 1970) {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-} module Data.ULID.TimeStamp ( ULIDTimeStamp, mkULIDTimeStamp,@@ -16,6 +17,7 @@ import Data.Text as T import Data.Time.Clock import Data.Time.Clock.POSIX+import GHC.Generics import qualified Data.ULID.Base32 as B32 @@ -24,20 +26,20 @@ -- | UNIX time in milliseconds newtype ULIDTimeStamp = ULIDTimeStamp Integer- deriving (Eq, Ord, Typeable, Data)+ deriving (Eq, Ord, Typeable, Data, Generic) instance Show ULIDTimeStamp where show (ULIDTimeStamp i) = T.unpack $ B32.encode 10 i instance Read ULIDTimeStamp where readsPrec _ = fmap- (\(int, rest)->(ULIDTimeStamp int, T.unpack rest))- . (B32.decode) 10+ (\(int, rest) -> (ULIDTimeStamp int, T.unpack rest))+ . B32.decode 10 . T.pack instance Binary ULIDTimeStamp where put (ULIDTimeStamp i) = mapM_ put (unroll numBytes i)- get = ULIDTimeStamp <$> roll <$> replicateM numBytes get+ get = ULIDTimeStamp . roll <$> replicateM numBytes get instance NFData ULIDTimeStamp where rnf (ULIDTimeStamp i) = rnf i
test/Data/ULIDSpec.hs view
@@ -75,6 +75,7 @@ decode (encode a2) `shouldBe` a2 encode a1 `shouldNotBe` encode a2 + -- TODO: This can have race conditions it "encodes MSB first" $ do a1 <- getULIDTime 12345 let e1 = encode a1
ulid.cabal view
@@ -1,5 +1,5 @@ name: ulid-version: 0.3.0.0+version: 0.3.2.0 synopsis: Implementation of ULID - Universally Unique Lexicographically Sortable Identifier description: Implementation of Alizain Feerasta's ULID specification.