content: {-# OPTIONS -fno-warn-orphans  #-}
  {-# LANGUAGE FlexibleInstances #-}
  module Fay.Exts.NoAnnotation where
  
  import           Fay.Compiler.Prelude
  
  import           Data.List.Split                 (splitOn)
  import           Data.String
  import qualified Language.Haskell.Exts as A
  
  type Alt = A.Alt ()
  type BangType = A.BangType ()
  type ClassDecl = A.ClassDecl ()
  type Decl = A.Decl ()
  type DeclHead = A.DeclHead ()
  type Ex = A.Exp ()
  type Exp = A.Exp ()
  type ExportSpec = A.ExportSpec ()
  type FieldDecl = A.FieldDecl ()
  type FieldUpdate = A.FieldUpdate ()
  type GadtDecl = A.GadtDecl ()
  type GuardedRhs = A.GuardedRhs ()
  type ImportDecl = A.ImportDecl ()
  type ImportSpec = A.ImportSpec ()
  type Literal = A.Literal ()
  type Match = A.Match ()
  type Module = A.Module ()
  type ModuleName = A.ModuleName ()
  type ModulePragma = A.ModulePragma ()
  type Name = A.Name ()
  type Pat = A.Pat ()
  type PatField = A.PatField ()
  type QName = A.QName ()
  type QOp = A.QOp ()
  type QualConDecl = A.QualConDecl ()
  type QualStmt = A.QualStmt ()
  type Rhs = A.Rhs ()
  type Sign = A.Sign ()
  type SpecialCon = A.SpecialCon ()
  type SrcLoc = A.SrcLoc
  type SrcSpan = A.SrcSpan
  type SrcSpanInfo = A.SrcSpanInfo
  type Stmt = A.Stmt ()
  type TyVarBind = A.TyVarBind ()
  type Type = A.Type ()
  
  unAnn :: Functor f => f a -> f ()
  unAnn = void
  
  -- | Helpful for some things.
  instance IsString (A.Name ()) where
    fromString n@(c:_)
      | isAlpha c || c == '_' = A.Ident () n
      | otherwise             = A.Symbol () n
    fromString [] = error "Name fromString: empty string"
  
  -- | Helpful for some things.
  instance IsString (A.QName ()) where
    fromString s = case splitOn "." s of
      []  -> error "QName fromString: empty string"
      [x] -> A.UnQual () $ fromString x
      xs  -> A.Qual () (fromString $ intercalate "." $ init xs) $ fromString (last xs)
  
  -- | Helpful for writing qualified symbols (Fay.*).
  instance IsString (A.ModuleName ()) where
     fromString = A.ModuleName ()
  