{-# LANGUAGE BangPatterns, Rank2Types, UnboxedTuples #-} -- | -- Module : Data.Text.Internal.Private -- Copyright : (c) 2011 Bryan O'Sullivan -- -- License : BSD-style -- Maintainer : bos@serpentine.com -- Stability : experimental -- Portability : GHC module Data.Text.Internal.Private ( runText , span_ ) where import Control.Monad.ST (ST, runST) import Data.Text.Internal (Text(..), text) import Data.Text.Unsafe (Iter(..), iter) import qualified Data.Text.Array as A span_ :: (Char -> Bool) -> Text -> (# Text, Text #) span_ p t@(Text arr off len) = (# hd,tl #) where hd = text arr off k tl = text arr (off+k) (len-k) !k = loop 0 loop !i | i < len && p c = loop (i+d) | otherwise = i where Iter c d = iter t i {-# INLINE span_ #-} runText :: (forall s. (A.MArray s -> Int -> ST s Text) -> ST s Text) -> Text runText act = runST (act $ \ !marr !len -> do arr <- A.unsafeFreeze marr return $! text arr 0 len) {-# INLINE runText #-}