{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE BangPatterns #-} module Data.Adnot.Type (Value(..), Array, Product, isValidSymbol) where import Control.DeepSeq (NFData(..)) import qualified Data.Char as C import Data.Data (Data) import Data.Typeable (Typeable) import Data.Map.Strict (Map) import qualified Data.Map as M import Data.Text (Text) import qualified Data.Text as T import Data.Vector (Vector) import GHC.Exts (IsString(..)) -- | An Adnot value represented as a Haskell value data Value = Sum !Text !Array | Product !Product | List !Array | Integer !Integer | Double !Double | String !Text deriving (Eq, Show, Read, Typeable, Data) instance NFData Value where rnf (Sum t as) = rnf t `seq` rnf as rnf (Product ls) = rnf ls rnf (List as) = rnf as rnf (Integer i) = rnf i rnf (Double d) = rnf d rnf (String t) = rnf t instance IsString Value where fromString = String . fromString type Array = Vector Value type Product = Map Text Value isValidSymbol :: Text -> Bool isValidSymbol t = case T.uncons t of Nothing -> False Just (x, xs) -> C.isAlpha x && T.all C.isAlphaNum xs