{-# LANGUAGE FlexibleInstances #-}

{- |
   Module:      Text.NaturalComp.Stringy
   Copyright:   2013 Hironao Komatsu
   License:     BSD
   Maintainer:  Hironao Komatsu <hirkmt@gmail.com>
   Portability: portable

   A type class that have methods @uncons@ and @toString@, so that we
   can handle them as String-like objects.
-}

module Text.NaturalComp.Stringy (Stringy (..)) where

import qualified Data.ByteString.UTF8 as U
import qualified Data.ByteString.Lazy.UTF8 as UL
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL

class Stringy s where
    uncons   :: s -> Maybe (Char, s)
    toString :: s -> String

instance Stringy [Char] where
    uncons :: [Char] -> Maybe (Char, [Char])
uncons []     = Maybe (Char, [Char])
forall a. Maybe a
Nothing
    uncons (Char
x:[Char]
xs) = (Char, [Char]) -> Maybe (Char, [Char])
forall a. a -> Maybe a
Just (Char
x, [Char]
xs)
    toString :: [Char] -> [Char]
toString      = [Char] -> [Char]
forall a. a -> a
id

instance Stringy U.ByteString where
    uncons :: ByteString -> Maybe (Char, ByteString)
uncons   = ByteString -> Maybe (Char, ByteString)
U.uncons
    toString :: ByteString -> [Char]
toString = ByteString -> [Char]
U.toString

instance Stringy UL.ByteString where
    uncons :: ByteString -> Maybe (Char, ByteString)
uncons   = ByteString -> Maybe (Char, ByteString)
UL.uncons
    toString :: ByteString -> [Char]
toString = ByteString -> [Char]
UL.toString

instance Stringy T.Text where
    uncons :: Text -> Maybe (Char, Text)
uncons   = Text -> Maybe (Char, Text)
T.uncons
    toString :: Text -> [Char]
toString = Text -> [Char]
T.unpack

instance Stringy TL.Text where
    uncons :: Text -> Maybe (Char, Text)
uncons   = Text -> Maybe (Char, Text)
TL.uncons
    toString :: Text -> [Char]
toString = Text -> [Char]
TL.unpack