content: {-# LANGUAGE Safe #-}
  -----------------------------------------------------------------------------
  -- |
  -- Module      : Hasmin.Class
  -- Copyright   : (c) 2017 Cristian Adrián Ontivero
  -- License     : BSD3
  -- Stability   : experimental
  -- Portability : non-portable
  --
  -----------------------------------------------------------------------------
  module Hasmin.Class
      ( ToText(..)
      , Minifiable(..)
      ) where
  
  import Control.Monad.Reader (Reader)
  import Data.Word (Word8)
  import Data.Text (pack, Text)
  import Data.Text.Lazy (toStrict)
  import Data.Text.Lazy.Builder (Builder, fromText, toLazyText)
  
  import Hasmin.Config
  
  -- | Class for types that can be minified
  class Minifiable a where
    {-# MINIMAL minify #-}
    minify :: a -> Reader Config a
  
  -- | Class for types that can be converted to Text. Used for printing the
  -- minified results.
  class ToText a where
    {-# MINIMAL toText | toBuilder #-}
    toText :: a -> Text
    toBuilder :: a -> Builder
    toText    = toStrict . toLazyText . toBuilder
    toBuilder = fromText . toText
  instance ToText Word8 where
    toText = pack . show
  instance ToText Int where
    toText = pack . show
  instance ToText Text where
    toText = id
  instance (ToText a, ToText b) => ToText (Either a b) where
    toText    = either toText toText
    toBuilder = either toBuilder toBuilder
  