@@ -28,6 +28,9 @@ module Data.UUID.Internal
2828 ,toASCIIBytes
2929 ,fromLazyASCIIBytes
3030 ,toLazyASCIIBytes
31+ ,UnpackedUUID(..)
32+ ,pack
33+ ,unpack
3134 ) where
3235
3336import Prelude hiding (null)
@@ -60,6 +63,7 @@ import qualified Data.ByteString.Lazy as BL
6063import qualified Data.ByteString.Unsafe as BU
6164
6265import Data.UUID.Builder
66+import Data.Word.Util
6367
6468import System.Random
6569
@@ -101,6 +105,54 @@ toWords (UUID w1 w2 w3 w4) = (w1, w2, w3, w4)
101105fromWords :: Word32 -> Word32 -> Word32 -> Word32 -> UUID
102106fromWords = UUID
103107
108+data UnpackedUUID =
109+ UnpackedUUID {
110+ time_low :: Word32 -- 0-3
111+ , time_mid :: Word16 -- 4-5
112+ , time_hi_and_version :: Word16 -- 6-7
113+ , clock_seq_hi_res :: Word8 -- 8
114+ , clock_seq_low :: Word8 -- 9
115+ , node_0 :: Word8
116+ , node_1 :: Word8
117+ , node_2 :: Word8
118+ , node_3 :: Word8
119+ , node_4 :: Word8
120+ , node_5 :: Word8
121+ }
122+ deriving (Read, Show, Eq, Ord)
123+
124+unpack :: UUID -> UnpackedUUID
125+unpack (UUID w0 w1 w2 w3) =
126+ build /-/ w0 /-/ w1 /-/ w2 /-/ w3
127+
128+ where
129+ build x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF =
130+ UnpackedUUID {
131+ time_low = word x0 x1 x2 x3
132+ , time_mid = w8to16 x4 x5
133+ , time_hi_and_version = w8to16 x6 x7
134+ , clock_seq_hi_res = x8
135+ , clock_seq_low = x9
136+ , node_0 = xA
137+ , node_1 = xB
138+ , node_2 = xC
139+ , node_3 = xD
140+ , node_4 = xE
141+ , node_5 = xF
142+ }
143+
144+pack :: UnpackedUUID -> UUID
145+pack unpacked =
146+ makeFromBytes /-/ (time_low unpacked)
147+ /-/ (time_mid unpacked)
148+ /-/ (time_hi_and_version unpacked)
149+ /-/ (clock_seq_hi_res unpacked)
150+ /-/ (clock_seq_low unpacked)
151+ /-/ (node_0 unpacked) /-/ (node_1 unpacked)
152+ /-/ (node_2 unpacked) /-/ (node_3 unpacked)
153+ /-/ (node_4 unpacked) /-/ (node_5 unpacked)
154+
155+
104156--
105157-- UTILITIES
106158--