packages feed

ddc-code-0.4.3.1: tetra/base/Data/Text/List.ds

-- | Conversions between Text and Lists.
module Data.Text.List
export 
{       textOfCharList;
        charListOfText;
}
import Data.Numeric.Word
import Data.Text.Base
import Data.Text.Char
import Data.List
where


-- | Convert a list of characters to a Text object.
textOfCharList (xx: List Char): Text
 = TextVec
 $ extend RegionText using r with { Alloc r; Read r; Write r }
   in  vectorOfCharList [r] xx


-- | O(n). Convert a text object to a list of characters.
charListOfText (tx: Text): List Char
 = case tx of
        TextVec vec -> charListOfTextVec vec
        _           -> charListOfTextVec (vectorOfText [RegionText] tx)


-- | Unpack a list of characters from a vector.
charListOfTextVec
        (vec: Vector# r Word8)
        : S (Read r) (List Char)
 = go 0
 where  
        go (ix: Nat): S (Read r) (List Char)
         | ix >= (vectorLength# vec - 1)
         = Nil

         | otherwise               
         = do   txChar = promote# (vectorRead# vec ix)
                Cons txChar (go (ix + 1))


-- | Pack a list of characters into a mutable vector.
vectorOfCharList
        [r: Region]
        (xx: List Char)
        : S (Alloc r + Write r) (Vector# r Word8)
 = do
        len     = length xx
        vec     = vectorAlloc# [r] (len + 1)

        fill (ix: Nat) (xx: List Char): S (Write r) Unit
         = case xx of
                Nil     -> ()
                Cons x xs
                 -> do  vectorWrite# vec ix (truncate# x)
                        fill (ix + 1) xs

                 | otherwise
                 -> do  fill (ix + 1) xs
        fill 0 xx

        vectorWrite# vec len 0w8
        vec