    {-# 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 #-}