{-# LANGUAGE OverloadedStrings #-}

module FlatBuffers.Internal.Compiler.Display where

import           Data.List.NonEmpty ( NonEmpty )
import qualified Data.List.NonEmpty as NE
import qualified Data.Text          as T
import           Data.Text          ( Text )

-- | Maps a value of type @a@ into a string that can be displayed to the user.
-- move this to its own file
class Display a where
  display :: a -> Text

instance Display Text where
  display = id

instance Display a => Display (NonEmpty a) where
  display = display . NE.toList

instance Display a => Display [a] where
  display xs = T.intercalate ", " (fmap displayOne xs)
    where
      displayOne x = "'" <> display x <> "'"

instance Display Integer where
  display = displayFromShow

displayFromShow :: Show a => a -> Text
displayFromShow = T.pack . show