{-# 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 []     = Nothing
    uncons (x:xs) = Just (x, xs)
    toString      = id

instance Stringy U.ByteString where
    uncons   = U.uncons
    toString = U.toString

instance Stringy UL.ByteString where
    uncons   = UL.uncons
    toString = UL.toString

instance Stringy T.Text where
    uncons   = T.uncons
    toString = T.unpack

instance Stringy TL.Text where
    uncons   = TL.uncons
    toString = TL.unpack