packages feed

spade-0.1.0.10: src/Compiler/Lexer/Identifiers.hs

module Compiler.Lexer.Identifiers where

import Common
import GHC.Generics
import Control.DeepSeq
import Control.Applicative
import Data.Char
import Data.String
import Data.Text as T
import Parser
import Test.Common

newtype Identifier = Identifier { unIdentifer :: Text }
  deriving (Show, Eq, Ord, Generic)

instance NFData Identifier

instance IsString Identifier where
  fromString = Identifier . T.pack

instance HasParser Identifier where
  parser = (\x -> Identifier $ pack x) <$> (do
    s <- pAny isAsciiLower
    rst <- many (pAny (\x -> isAlphaNum x || x == '_'))
    pure (s : rst)
    )

instance ToSource Identifier where
  toSource = unIdentifer

instance HasGen Identifier where
  getGen = Identifier <$> choice
    [ gen
    , do x <- gen;  s <- int (linear 0 999); pure (x <> (pack $ show s))
    ]
    where
      gen = ((pack . (\x -> "identi" <> x)) <$> (list (linear 1 10) (choice [lower, upper])))