-- | (Orphan) PrettyVal instances for various standard datatypes
{-# OPTIONS_GHC -fno-warn-orphans #-}
module IdeSession.Util.PrettyVal (
    -- * Re-exports
    PrettyVal(..)
  ) where

import Text.Show.Pretty
import Data.IntMap (IntMap)
import Data.Map (Map)
import Data.Trie (Trie)
import Data.ByteString (ByteString)
import Data.Text (Text)
import qualified Data.IntMap           as IntMap
import qualified Data.Map              as Map
import qualified Data.Trie             as Trie
import qualified Data.ByteString.Char8 as BSC
import qualified Data.Text             as Text

instance PrettyVal a => PrettyVal (Maybe a) where
  prettyVal Nothing  = Con "Nothing" []
  prettyVal (Just x) = Con "Just"    [prettyVal x]

-- TODO: This has encoding issues
instance PrettyVal ByteString where
  prettyVal = prettyVal . BSC.unpack

instance PrettyVal a => PrettyVal (IntMap a) where
  prettyVal m = Con "fromList" [prettyVal . IntMap.toList $ m]

instance (PrettyVal k, PrettyVal a) => PrettyVal (Map k a) where
  prettyVal m = Con "fromList" [prettyVal . Map.toList $ m]

instance PrettyVal a => PrettyVal (Trie a) where
  prettyVal m = Con "fromList" [prettyVal . Trie.toList $ m]

instance PrettyVal Bool where
  prettyVal True  = Con "True"  []
  prettyVal False = Con "False" []

instance PrettyVal Text where
  prettyVal = prettyVal . Text.unpack