Some more functions, and docs
authoriavor.diatchki <iavor.diatchki@gmail.com>
Mon, 10 Mar 2008 05:15:21 +0000 (22:15 -0700)
committeriavor.diatchki <iavor.diatchki@gmail.com>
Mon, 10 Mar 2008 05:15:21 +0000 (22:15 -0700)
darcs-hash:20080310051521-5035a-d3445fdf6b02858b7d64da1a680a5124cdf9df56.gz

Codec/Binary/UTF8/Generic.hs
Data/String/UTF8.hs

index 275b621..8b08724 100644 (file)
@@ -4,7 +4,7 @@
 --   output of the Codec.Binary.UTF8.String output for invalid encodings
 --   as the number of replacement characters is sometimes longer.
 module Codec.Binary.UTF8.Generic
-  ( UTF8Bytes()
+  ( UTF8Bytes(..)
   , decode
   , replacement_char
   , uncons
index d7db353..77be9b0 100644 (file)
@@ -1,24 +1,33 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# OPTIONS_GHC -fallow-undecidable-instances #-}
 module Data.String.UTF8
-  ( UTF8
+  ( -- * Representation
+    UTF8
   , UTF8Bytes()
+  , fromString
+  , toString
+  , fromRep
+  , toRep
   , G.replacement_char
+
+  -- * Character based operations
   , uncons
   , splitAt
   , take
   , drop
   , span
   , break
-  , fromString
-  , toString
-  , fromRep
-  , toRep
   , foldl
   , foldr
   , length
   , lines
   , lines'
+
+  -- * Representation based operations
+  , decode
+  , byteSplitAt
+  , byteTake
+  , byteDrop
   ) where
 
 import Prelude hiding (take,drop,span,break,foldl,foldr,length,lines,splitAt)
@@ -51,11 +60,30 @@ toString (Str xs) = G.toString xs
 
 -- | Split after a given number of characters.
 -- Negative values are treated as if they are 0.
+-- See also 'bytesSplitAt'.
 splitAt :: UTF8Bytes string index
         => index -> UTF8 string -> (UTF8 string, UTF8 string)
 splitAt x (Str bs)  = case G.splitAt x bs of
                         (s1,s2) -> (Str s1, Str s2)
 
+-- | Split after a given number of bytes in the underlying representation.
+-- See also 'splitAt'.
+byteSplitAt :: UTF8Bytes string index
+             => index -> UTF8 string -> (UTF8 string, UTF8 string)
+byteSplitAt n (Str x) = case G.bsplit n x of
+                          (as,bs) -> (Str as, Str bs)
+
+-- | Take only the given number of bytes from the underlying representation.
+-- See also 'take'.
+byteTake :: UTF8Bytes string index => index -> UTF8 string -> UTF8 string
+byteTake n (Str x) = Str (fst (G.bsplit n x))
+
+-- | Drop the given number of bytes from the underlying representation.
+-- See also 'drop'.
+byteDrop :: UTF8Bytes string index => index -> UTF8 string -> UTF8 string
+byteDrop n (Str x) = Str (snd (G.bsplit n x))
+
+
 -- | @take n s@ returns the first @n@ characters of @s@.
 -- If @s@ has less then @n@ characters, then we return the whole of @s@.
 take :: UTF8Bytes string index => index -> UTF8 string -> UTF8 string
@@ -91,6 +119,13 @@ uncons :: UTF8Bytes string index
 uncons (Str x)  = do (c,y) <- G.uncons x
                      return (c, Str y)
 
+-- | Extract the first character for the underlying representation,
+-- if one is avaialble.  It also returns the number of bytes used
+-- in the representation of the character.
+-- See also 'uncons', 'dropBytes'.
+decode :: UTF8Bytes string index => UTF8 string -> Maybe (Char, index)
+decode (Str x)  = G.decode x
+
 -- | Traverse a bytestring (right biased).
 foldr :: UTF8Bytes string index => (Char -> a -> a) -> a -> UTF8 string -> a
 foldr cons nil (Str cs) = G.foldr cons nil cs