```-- {-# LANGUAGE #-}
{-# OPTIONS_GHC -Wall -fno-warn-missing-signatures #-}
----------------------------------------------------------------------
-- |
-- Copyright   :  (c) Conal Elliott 2009
--
-- Maintainer  :  conal@conal.net
-- Stability   :  experimental
--
-- Test new CSE stuff
----------------------------------------------------------------------

-- import Control.Applicative (liftA2)

import Data.VectorSpace
-- For testing
import Text.PrettyPrint.Leijen.DocExpr (Expr,HasExpr(expr))

import Data.Boolean

x :: HasExpr a => a -> Expr
x = expr

type Point = ComplexE R

{-
xc :: Color -> Expr
xc = expr . colorToR4

xp :: Point -> Expr
xp = expr . pointToR2

-}

q :: FloatE
q = Var (var "q")

t1,t2 :: FloatE
t1 = q + q

-- Was @q * (q + q)@, now @let a = q + q in a * a@.  What happened?
t2 = t1 * t1

c1 = cse t1

t3a = sin q / cos q

--     let a = sin(q) in
--       let b = cos(q) in
--         b + a / b
--
t3 = cos q + t3a

-- cse => cos(q) + sin(q) / cos(q)

t3b = cq + sq / cq
where
cq = cos q
sq = sin q

-- cse => let x3 = cos(q) in x3 + sin(q) / x3

--     let a = cos(q) in
--       a - 1.0 / a
--
t4 = cos q - 1 / cos q

-- let a = cos(q) in
--   a * (a + sin(q) / a)
--
t5 = cos q * t3

-- let a = cos(q) in
--   (a + sin(q) / a) * (a - 1.0 / a)
--
t6 = t3 * t4

-- let a = cos(q) in
--   let b = sin(q) in
--     (a + b / a) * (a - 1.0 / a) + (a + b / a)

t7  = t6 + t3

-- let a = sin(q) in
--   a + (1.0 - a) * (a < 3.0 ? 4.0 : 5.0)
--
t8 = let a = sin q in a + (1 - a) * (ifB (a <* 3) 4 5)

-- q * sin(q)
r = q * sin q

-- let a = sin(q) in
--   a * (q * a)
s = sin q * r

-- let a = sin(q) in
--   let b = q * a in
--     b + a * b
t9a = r + s

-- let a = sin(q) in
--   let b = q * a in
--     a * b + b
t9b = s + r

w = Var (var "w") :: R2E

{-

bw :: BoolE -> Color
bw = boolean white clear

ra :: R2E -> Color
ra z = bw (z <.> z <* 1)
-}

stripes (a :+ _) = frac a <* 0.5

a1 :: FloatE
a1 = magnitudeSq (t *^ uv)

{-
a2 :: BoolE
a2 = uscale2 t udisk uv

a3 :: R4E
a3 = colorToR4 \$ toColor (uscale2 (cos t) udisk uv)
-}

t :: FloatE
t = Var (var "t")
u,v :: FloatE
u = Var (var "u")
v = Var (var "v")

uv :: Point
uv = u :+ v

-------------

ts = [t1,t2,t3a,t3,t4,t5,t6,t8,t9a,t9b]

main = mapM_ (print.expr) ts
```