--
import Trex

{-
data Term e = Z (Rec (z :: Int | e) -> Int)
            | W (Rec (w :: Int | e) -> Int)
            | Int Int
            | Plus (Term e ) (Term e)
-}

data Term e = Z (e -> Int)
            | Int Int
            | Plus (Term e ) (Term e)


eval (Int n) env = n
eval (Plus x y) env = (eval x env) + (eval y env)


ex1 = ( a= 4, b= "z")

ex2 = ( a = True, c = [1,2,3])

ex3 = #a ex1

ex4 = #a ex2

{-
Main> :t ex3
ex3 :: Integer

Main> :t ex4
ex4 :: Bool

Main> :t ex1
ex1 :: Rec (a :: Integer, b :: [Char])

Main> :t #a
#a :: a\a => Rec (a :: b | a) -> b
-}

ex5 = ( name = "tim", age = 12 )
ex6 = (age = 12, name = "tim")

{-
Main> show ex5
"(age=12, name=\"tim\")"

Main> show ex6
"(age=12, name=\"tim\")"

Main> ex5==ex6
Bool_True
-}

------- Pattern matching

f (name = x, age = y) = y +1

g ( a = x ) = x

{-
Main> :t f
f :: Num a => Rec (name :: b, age :: a) -> a
Main> f ex5
13
Main> g ex1
ERROR: Type error in application
*** Expression     : g ex1
*** Term           : ex1
*** Type           : Rec (a :: Integer, b :: [Char])
*** Does not match : Rec (a :: Integer)
*** Because        : rows are not compatible
-}

--------------- Extensible records -----------

h1 z = ( a = True | z )

h2 z = ( c = 24, d= True | z )

{-
Main> show (h1 ex5)
"(a=True, age=12, name=\"tim\")"
Main> show (h2 ex1)
"(a=4, b=\"z\", c=24, d=True)"

Main> h1 ex1
ERROR: Cannot satisfy constraint (a :: Integer, b :: [Char])\a

Main> h2 (c=False)
ERROR: Cannot satisfy constraint (c :: Bool)\c

-}

h3 (a = _ | z ) w = (b = True , red = w | z)

{-
Main> :t #a
#a :: a\a => Rec (a :: b | a) -> b
Main> :t h1
h1 :: a\a => Rec a -> Rec (a :: Bool | a)
h3 :: (a\a, a\b, a\red) => Rec (a :: b | a) -> c -> Rec (b :: Bool, red :: c | a)
-}

ex7 = (a = 1, b = True, c = [1], d ="z", e = 23.1 )

removeac ( a = _, c = _ | z ) = z

{-
Main> show(removeac ex7)
"(b=True, d=\"z\", e=23.1)"
-}

j (name=x, age = w | z ) = (w+1,(name = x |z));

{-
Main> :t j
j :: (a\name, a\age, Num b) => Rec (name :: c, age :: b | a) -> (b,Rec (name :: c
 | a))
 -}



--