module GF.Compile.Compute.Value where
import GF.Grammar.Grammar(Label,Type,MetaId,Patt,QIdent)
import PGF.Internal(BindType)
import GF.Infra.Ident(Ident)
import Text.Show.Functions()
import Data.Ix(Ix)

-- | Self-contained (not quite) representation of values
data Value
  = VApp Predefined [Value] -- from Q, always Predef.x, has a built-in value
  | VCApp QIdent [Value] -- from QC, constructors
  | VGen Int [Value] -- for lambda bound variables, possibly applied
  | VMeta MetaId Env [Value]
-- -- | VClosure Env Term -- used in Typecheck.ConcreteNew
  | VAbs BindType Ident Binding -- used in Compute.Concrete
  | VProd BindType Value Ident Binding -- used in Compute.Concrete
  | VInt Int
  | VFloat Double
  | VString String
  | VSort Ident
  | VImplArg Value
  | VTblType Value Value
  | VRecType [(Label,Value)]
  | VRec [(Label,Value)]
  | VV Type [Value] [Value] -- preserve type for conversion back to Term
  | VT Wild Value [(Patt,Bind Env)]
  | VC Value Value
  | VS Value Value
  | VP Value Label
  | VPatt Patt
  | VPattType Value
  | VFV [Value]
  | VAlts Value [(Value, Value)]
  | VStrs [Value]
-- -- | VGlue Value Value -- hmm
-- --  | VExtR Value Value -- hmm
  | VError String
  deriving (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c== :: Value -> Value -> Bool
Eq,Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Value] -> ShowS
$cshowList :: [Value] -> ShowS
show :: Value -> String
$cshow :: Value -> String
showsPrec :: Int -> Value -> ShowS
$cshowsPrec :: Int -> Value -> ShowS
Show)

type Wild = Bool
type Binding = Bind Value
data Bind a = Bind (a->Value) deriving Int -> Bind a -> ShowS
[Bind a] -> ShowS
Bind a -> String
(Int -> Bind a -> ShowS)
-> (Bind a -> String) -> ([Bind a] -> ShowS) -> Show (Bind a)
forall a. Int -> Bind a -> ShowS
forall a. [Bind a] -> ShowS
forall a. Bind a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Bind a] -> ShowS
$cshowList :: forall a. [Bind a] -> ShowS
show :: Bind a -> String
$cshow :: forall a. Bind a -> String
showsPrec :: Int -> Bind a -> ShowS
$cshowsPrec :: forall a. Int -> Bind a -> ShowS
Show

instance Eq (Bind a) where Bind a
x== :: Bind a -> Bind a -> Bool
==Bind a
y = Bool
False

type Env = [(Ident,Value)]

-- | Predefined functions
data Predefined = Drop | Take | Tk | Dp | EqStr | Occur | Occurs | ToUpper
                | ToLower | IsUpper | Length | Plus | EqInt | LessInt
             {- | Show | Read | ToStr | MapStr | EqVal -}
                | Error | Trace
                -- Canonical values below:
                | PBool | PFalse | PTrue | Int | Float | Ints | NonExist
                | BIND | SOFT_BIND | SOFT_SPACE | CAPIT | ALL_CAPIT
                deriving (Int -> Predefined -> ShowS
[Predefined] -> ShowS
Predefined -> String
(Int -> Predefined -> ShowS)
-> (Predefined -> String)
-> ([Predefined] -> ShowS)
-> Show Predefined
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Predefined] -> ShowS
$cshowList :: [Predefined] -> ShowS
show :: Predefined -> String
$cshow :: Predefined -> String
showsPrec :: Int -> Predefined -> ShowS
$cshowsPrec :: Int -> Predefined -> ShowS
Show,Predefined -> Predefined -> Bool
(Predefined -> Predefined -> Bool)
-> (Predefined -> Predefined -> Bool) -> Eq Predefined
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Predefined -> Predefined -> Bool
$c/= :: Predefined -> Predefined -> Bool
== :: Predefined -> Predefined -> Bool
$c== :: Predefined -> Predefined -> Bool
Eq,Eq Predefined
Eq Predefined
-> (Predefined -> Predefined -> Ordering)
-> (Predefined -> Predefined -> Bool)
-> (Predefined -> Predefined -> Bool)
-> (Predefined -> Predefined -> Bool)
-> (Predefined -> Predefined -> Bool)
-> (Predefined -> Predefined -> Predefined)
-> (Predefined -> Predefined -> Predefined)
-> Ord Predefined
Predefined -> Predefined -> Bool
Predefined -> Predefined -> Ordering
Predefined -> Predefined -> Predefined
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Predefined -> Predefined -> Predefined
$cmin :: Predefined -> Predefined -> Predefined
max :: Predefined -> Predefined -> Predefined
$cmax :: Predefined -> Predefined -> Predefined
>= :: Predefined -> Predefined -> Bool
$c>= :: Predefined -> Predefined -> Bool
> :: Predefined -> Predefined -> Bool
$c> :: Predefined -> Predefined -> Bool
<= :: Predefined -> Predefined -> Bool
$c<= :: Predefined -> Predefined -> Bool
< :: Predefined -> Predefined -> Bool
$c< :: Predefined -> Predefined -> Bool
compare :: Predefined -> Predefined -> Ordering
$ccompare :: Predefined -> Predefined -> Ordering
$cp1Ord :: Eq Predefined
Ord,Ord Predefined
Ord Predefined
-> ((Predefined, Predefined) -> [Predefined])
-> ((Predefined, Predefined) -> Predefined -> Int)
-> ((Predefined, Predefined) -> Predefined -> Int)
-> ((Predefined, Predefined) -> Predefined -> Bool)
-> ((Predefined, Predefined) -> Int)
-> ((Predefined, Predefined) -> Int)
-> Ix Predefined
(Predefined, Predefined) -> Int
(Predefined, Predefined) -> [Predefined]
(Predefined, Predefined) -> Predefined -> Bool
(Predefined, Predefined) -> Predefined -> Int
forall a.
Ord a
-> ((a, a) -> [a])
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Bool)
-> ((a, a) -> Int)
-> ((a, a) -> Int)
-> Ix a
unsafeRangeSize :: (Predefined, Predefined) -> Int
$cunsafeRangeSize :: (Predefined, Predefined) -> Int
rangeSize :: (Predefined, Predefined) -> Int
$crangeSize :: (Predefined, Predefined) -> Int
inRange :: (Predefined, Predefined) -> Predefined -> Bool
$cinRange :: (Predefined, Predefined) -> Predefined -> Bool
unsafeIndex :: (Predefined, Predefined) -> Predefined -> Int
$cunsafeIndex :: (Predefined, Predefined) -> Predefined -> Int
index :: (Predefined, Predefined) -> Predefined -> Int
$cindex :: (Predefined, Predefined) -> Predefined -> Int
range :: (Predefined, Predefined) -> [Predefined]
$crange :: (Predefined, Predefined) -> [Predefined]
$cp1Ix :: Ord Predefined
Ix,Predefined
Predefined -> Predefined -> Bounded Predefined
forall a. a -> a -> Bounded a
maxBound :: Predefined
$cmaxBound :: Predefined
minBound :: Predefined
$cminBound :: Predefined
Bounded,Int -> Predefined
Predefined -> Int
Predefined -> [Predefined]
Predefined -> Predefined
Predefined -> Predefined -> [Predefined]
Predefined -> Predefined -> Predefined -> [Predefined]
(Predefined -> Predefined)
-> (Predefined -> Predefined)
-> (Int -> Predefined)
-> (Predefined -> Int)
-> (Predefined -> [Predefined])
-> (Predefined -> Predefined -> [Predefined])
-> (Predefined -> Predefined -> [Predefined])
-> (Predefined -> Predefined -> Predefined -> [Predefined])
-> Enum Predefined
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Predefined -> Predefined -> Predefined -> [Predefined]
$cenumFromThenTo :: Predefined -> Predefined -> Predefined -> [Predefined]
enumFromTo :: Predefined -> Predefined -> [Predefined]
$cenumFromTo :: Predefined -> Predefined -> [Predefined]
enumFromThen :: Predefined -> Predefined -> [Predefined]
$cenumFromThen :: Predefined -> Predefined -> [Predefined]
enumFrom :: Predefined -> [Predefined]
$cenumFrom :: Predefined -> [Predefined]
fromEnum :: Predefined -> Int
$cfromEnum :: Predefined -> Int
toEnum :: Int -> Predefined
$ctoEnum :: Int -> Predefined
pred :: Predefined -> Predefined
$cpred :: Predefined -> Predefined
succ :: Predefined -> Predefined
$csucc :: Predefined -> Predefined
Enum)