{-# LANGUAGE DeriveGeneric #-}

module Arbor.File.Format.Asif.Whatever where

import Data.Text                       (Text)
import GHC.Generics
import GHC.Read
import Text.ParserCombinators.ReadP    as P
import Text.ParserCombinators.ReadPrec

import qualified Data.Text                       as T
import qualified Text.ParserCombinators.ReadPrec as R

data Whatever a = Known a | Unknown Text deriving (Eq, Generic)

instance Show a => Show (Whatever a) where
  showsPrec n (Known a)   = showsPrec n a
  showsPrec _ (Unknown t) = (T.unpack t ++)

showWhatever :: Show a => Whatever a -> String
showWhatever (Known a)   = show a
showWhatever (Unknown a) = T.unpack a

readWhatever :: Read a => String -> Whatever a
readWhatever s =
  case [x | (x,"") <- R.readPrec_to_S read' R.minPrec s] of
    [x] -> Known x
    _   -> Unknown (T.pack s)
  where read' = do
                  x <- readPrec
                  lift P.skipSpaces
                  return x

tShowWhatever :: Show a => Whatever a -> Text
tShowWhatever = T.pack . showWhatever

tReadWhatever :: Read a => Text -> Whatever a
tReadWhatever = readWhatever . T.unpack