packages feed

portable-lines (empty) → 0.1

raw patch · 6 files changed

+166/−0 lines, 6 filesdep +basedep +bytestringsetup-changed

Dependencies added: base, bytestring

Files

+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2011, Joseph Adams++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Joseph Adams nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Text/PortableLines.hs view
@@ -0,0 +1,30 @@+module Text.PortableLines+    ( lines+    ) where++import Prelude hiding (lines)+import qualified Prelude as P++-- | Like the 'P.lines' function from Prelude, but treat the @\"\\r\\n\"@ and+--   @\"\\r\"@ sequences as newlines too, not just @\"\\n\"@.+lines :: String -> [String]+lines []  = []+lines str = let (a, str') = breakNewline str+             in a : lines str'++breakNewline :: String -> (String, String)+breakNewline []       = ([], [])+breakNewline (x : xs) =+    case x of+        '\n' -> ([], xs)+        '\r' -> ([], case xs of+                         ('\n' : xs') -> xs'+                         _            -> xs)+                -- The reason for the weird case expression instead of just a+                -- ('\r' : '\n' : s) pattern is for better laziness.+                -- Otherwise, lines ("hello\r" ++ undefined) would fail to+                -- completely yield the first line.  If we see a '\r', we know+                -- the line has ended, so don't force the next character+                -- immediately.+        _    -> let (line, rest) = breakNewline xs+                 in (x : line, rest)
+ Text/PortableLines/ByteString.hs view
@@ -0,0 +1,31 @@+module Text.PortableLines.ByteString+    ( lines8+    ) where++import Prelude as P hiding (lines)++import Data.ByteString.Char8 (ByteString)+import Data.ByteString.Unsafe (unsafeIndex, unsafeTail, unsafeDrop)++import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as B8++-- | Like the 'B8.lines' function from Data.ByteString.Char8, but treat the+-- @\"\\r\\n\"@ and @\"\\r\"@ sequences as newlines too, not just @\"\\n\"@.+--+-- Input is assumed to be in ASCII or an ASCII-compatible encoding (at least+-- with respect to newline characters).  For example, UTF-8 is fine, but UTF-16+-- is not.+lines8 :: ByteString -> [ByteString]+lines8 str | B.null str = []+           | otherwise  = let (line, rest) = breakNewline8 str+                           in line : lines8 rest++breakNewline8 :: ByteString -> (ByteString, ByteString)+breakNewline8 str =+    case B.break (\c -> c == 13 || c == 10) str of+        (line, rest) | B.null rest                      -> (line, rest)+                     | B.length rest >= 2 &&+                       rest `unsafeIndex` 0 == 13 &&+                       rest `unsafeIndex` 1 == 10       -> (line, unsafeDrop 2 rest)+                     | otherwise                        -> (line, unsafeTail rest)
+ Text/PortableLines/ByteString/Lazy.hs view
@@ -0,0 +1,30 @@+module Text.PortableLines.ByteString.Lazy+    ( lines8+    ) where++import Prelude as P hiding (lines)++import Data.ByteString.Lazy (ByteString)++import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Lazy.Char8 as L8++-- | Like the 'L8.lines' function from Data.ByteString.Lazy.Char8, but treat the+-- @\"\\r\\n\"@ and @\"\\r\"@ sequences as newlines too, not just @\"\\n\"@.+--+-- Input is assumed to be in ASCII or an ASCII-compatible encoding (at least+-- with respect to newline characters).  For example, UTF-8 is fine, but UTF-16+-- is not.+lines8 :: ByteString -> [ByteString]+lines8 str | L.null str = []+           | otherwise  = let (line, rest) = breakNewline8 str+                           in line : lines8 rest++breakNewline8 :: ByteString -> (ByteString, ByteString)+breakNewline8 str =+    case L.break (\c -> c == 13 || c == 10) str of+        (line, rest) | L.null rest                -> (line, rest)+                     | L.length rest >= 2 &&+                       rest `L.index` 0 == 13 &&+                       rest `L.index` 1 == 10     -> (line, L.drop 2 rest)+                     | otherwise                  -> (line, L.tail rest)
+ portable-lines.cabal view
@@ -0,0 +1,43 @@+name:                portable-lines+version:             0.1+synopsis:            Alternative 'lines' implementation that understands CR-LF and CR+description:+    Provides an alternative implementation of the 'Prelude.lines' function that+    treats the following sequences as newline characters:+    .+    * @\"\\r\\n\"@ (Windows style)+    .+    * @\"\\r\"@ (Macintosh style, before OS X)+    .+    * @\"\\n\"@ (Unix style)+    .+    Haskell's IO system supports both platform-specific line ending conversion+    (by opening the file in \"text mode\"), and explicit setting of the newline+    mode for input and output (see 'System.IO.hSetNewlineMode').  However:+    .+    * If you don't know the line ending format in advance, you would have to+      open the file and detect the newline format manually.+    .+    * ByteString currently honors neither of these; see+      <http://stackoverflow.com/questions/6837628>.++license:             BSD3+license-file:        LICENSE+author:              Joey Adams+maintainer:          joeyadams3.14159@gmail.com+copyright:           Copyright (c) Joseph Adams 2011+category:            Text+build-type:          Simple+cabal-version:       >=1.8++source-repository head+    type:       git+    location:   git://github.com/joeyadams/haskell-portable-lines.git++library+    exposed-modules: Text.PortableLines+                   , Text.PortableLines.ByteString+                   , Text.PortableLines.ByteString.Lazy+    build-depends: base == 4.*+                 , bytestring+    ghc-options: -Wall -O2