on master help sign in
Add reverseIter, to support scanr eventually.
4efa78eBryan O'Sullivan
Data/Text/Unsafe.hs+14
@@ -12,6 +12,7 @@ module Data.Text.Unsafe
12 (
12 (
13 iter
13 iter
14 , iter_
14 , iter_
15+ , reverseIter
15 , unsafeHead
16 , unsafeHead
16 , unsafeTail
17 , unsafeTail
17 ) where
18 ) where
@@ -62,3 +63,16 @@ iter_ (Text arr off len) i | m < 0xD800 || m > 0xDBFF = 1
62 | otherwise = 2
63 | otherwise = 2
63 where m = assert (i >= 0 && i < len) $ A.unsafeIndex arr (off+i)
64 where m = assert (i >= 0 && i < len) $ A.unsafeIndex arr (off+i)
64{-# INLINE iter_ #-}
65{-# INLINE iter_ #-}
66+
67+-- | /O(1)/ Iterate one step backwards through a UTF-16 array,
68+-- returning the current character and the delta to add (i.e. a
69+-- negative number) to give the next offset to iterate at.
70+reverseIter :: Text -> Int -> (Char,Int)
71+reverseIter (Text arr off len) i
72+ | m < 0xDC00 || m > 0xDFFF = (unsafeChr m, -1)
73+ | otherwise = (chr2 n m, -2)
74+ where m = assert (i < len) $ A.unsafeIndex arr j
75+ n = assert (i - 1 >= 0) $ A.unsafeIndex arr k
76+ j = assert (i >= 0) $ off + i
77+ k = j - 1
78+{-# INLINE reverseIter #-}