packages feed

HarmTrace-0.4: MIR/HarmGram/ShowChord.hs

{-# LANGUAGE TypeOperators            #-}
{-# LANGUAGE FlexibleInstances        #-}
{-# LANGUAGE FlexibleContexts         #-}
{-# LANGUAGE OverlappingInstances     #-}

module MIR.HarmGram.ShowChord (ShowChord(..), showChordDefault, paren) where

import Generics.Instant.Base

-- Generic show for chords on Representable (worker)
class ShowChord a where
  showChord :: a -> ShowS

instance ShowChord U where
  {- INLINE showChord #-}
  showChord U = showString ""
  
instance (ShowChord a, ShowChord b) => ShowChord (a :+: b) where
  {- INLINE showChord #-}
  showChord (L x) = showChord x
  showChord (R x) = showChord x
  
instance (ShowChord a, ShowChord b) => ShowChord (a :*: b) where
  {- INLINE showChord #-}
  showChord (a :*: b) = showChord a . showChord b
  
instance (ShowChord a, Constructor c) => ShowChord (C c a) where
  {- INLINE showChord #-}
  -- showChord c@(C a) = paren $ showString (takeWhile (/= '_') (conName c)) . showChord a
  showChord c@(C a) = paren $ showString (conName c) . showChord a

instance ShowChord a => ShowChord (Var a) where
  {- INLINE showChord #-}
  showChord (Var x) = showChord x

instance ShowChord a => ShowChord (Rec a) where
  {- INLINE showChord #-}
  showChord (Rec x) = showChord x


-- Dispatcher
{- INLINE showChordDefault #-}
showChordDefault :: (Representable a, ShowChord (Rep a)) => a -> ShowS
showChordDefault = showChord . from


-- Adhoc instances
instance ShowChord Int      where 
  {- INLINE showChord #-}
  showChord = shows
instance ShowChord Integer  where 
  {- INLINE showChord #-}
  showChord = shows
instance ShowChord Float    where 
  {- INLINE showChord #-}
  showChord = shows
instance ShowChord Double   where 
  {- INLINE showChord #-}
  showChord = shows
instance ShowChord Char     where 
  {- INLINE showChord #-}
  showChord = shows
instance ShowChord Bool     where 
  {- INLINE showChord #-}
  showChord = shows


instance ShowChord a => ShowChord [a] where
  {- INLINE showChord #-}
  showChord = paren . foldr (.) id . map showChord
  
instance ShowChord [Char] where
  {- INLINE showChord #-}
  showChord = showString

instance (ShowChord a) => ShowChord (Maybe a) where
  {- INLINE showChord #-}
  showChord Nothing  = id
  showChord (Just a) = showChord a

-- Utilities
paren :: ShowS -> ShowS
paren x = showChar '[' . x . showChar ']'