{-# LANGUAGE TypeSynonymInstances #-}

module Data.Array.Judy.Stringable (
    Stringable (..)
) where

import Foreign.C.String
import qualified Data.ByteString as B (ByteString, useAsCString, useAsCStringLen)
import Data.ByteString.Unsafe as BU (unsafePackCString, unsafePackCStringLen)
-- TODO: See if its possible to use Storable, ie. to let any Storable type be "stringable".

class Stringable k where
    toString :: k -> String
    fromString :: String -> k

    useAsCS :: k -> (CString -> IO a) -> IO a
    useAsCS k = withCAString (toString k)
    useAsCSLen :: k -> (CStringLen -> IO a) -> IO a
    useAsCSLen k = withCAStringLen (toString k)

    copyCS :: CString -> IO k
    copyCS c = peekCAString c >>= return . fromString
    copyCSLen :: CStringLen -> IO k
    copyCSLen c = peekCAStringLen c >>= return . fromString

instance Stringable String where
    toString = id
    fromString = id

instance Stringable B.ByteString where
    toString = undefined
    fromString = undefined

    useAsCS = B.useAsCString
    useAsCSLen = B.useAsCStringLen

    copyCS = BU.unsafePackCString
    copyCSLen = BU.unsafePackCStringLen

--instance Stringable Int where
--    toString = show
--    fromString = read