content: {-# LANGUAGE TypeSynonymInstances #-}
  
  -----------------------------------------------------------------------------
  -- |
  -- Module      : Berp.Compile.IdentString
  -- Copyright   : (c) 2010 Bernie Pope
  -- License     : BSD-style
  -- Maintainer  : florbitous@gmail.com
  -- Stability   : experimental
  -- Portability : ghc
  --
  -- Strings encoding identifiers and ways to convert other things to them.
  --
  -----------------------------------------------------------------------------
  
  module Berp.Compile.IdentString where
  
  import Language.Python.Common.AST
  
  newtype IdentString = IdentString { fromIdentString :: String }
     deriving (Eq, Ord, Show)
  
  class ToIdentString t where
     toIdentString :: t -> IdentString
  
  instance ToIdentString IdentString where
     toIdentString = id
  
  instance ToIdentString String where
     toIdentString str = IdentString str
  
  instance ToIdentString (Ident a) where
     toIdentString (Ident { ident_string = name }) = IdentString name
  
  instance ToIdentString (Expr a) where
     toIdentString (Var { var_ident = ident }) = toIdentString ident
     toIdentString _other = error "toIdentString applied to an expression which is not a variable"
  
  identString :: ToIdentString a => a -> String
  identString = fromIdentString . toIdentString
  