@@ -12,6 +12,7 @@ module Data.Text.Unsafe
1212 (
1313 iter
1414 , iter_
15+ , reverseIter
1516 , unsafeHead
1617 , unsafeTail
1718 ) where
@@ -62,3 +63,16 @@ iter_ (Text arr off len) i | m < 0xD800 || m > 0xDBFF = 1
6263 | otherwise = 2
6364 where m = assert (i >= 0 && i < len) $ A.unsafeIndex arr (off+i)
6465{-# 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 #-}