
module Main where

import System.Random
import Control.Parallel


main :: IO ()
main = putStr . show $ 
            (eqTreeP bigTree bigTree, eqTreeP bigTree (tweakRightmost bigTree))


-- Tree datatype
data Tree a = Leaf | Bin a (Tree a) (Tree a) -- deriving (Show, Eq)

eqTreeP :: Tree Int -> Tree Int -> Bool
eqTreeP Leaf           Leaf           = True
eqTreeP (Bin x1 l1 r1) (Bin x2 l2 r2) = x1 == x2 && par r (pseq l (l && r))
                                            where l = eqTreeP l1 l2
                                                  r = eqTreeP r1 r2
eqTreeP _              _              = False


-- Tweak the rightmost element of a Tree
tweakRightmost :: Tree Int -> Tree Int
tweakRightmost Leaf             = Leaf
tweakRightmost (Bin x l Leaf)   = Bin (x+1) l Leaf
tweakRightmost (Bin x l r)      = Bin x l (tweakRightmost r)


genTree :: [Int] -> Tree Int
genTree []    = Leaf
genTree [_]   = Leaf
genTree (h:t@(_:_)) | even h = Bin h (genTree t) (genTree (tail t))
                    | odd h  = Bin h (genTree (tail t)) (genTree t)


bigTreeGen :: Int -> Tree Int
bigTreeGen seed = genTree . take 30 $ randomRs (0,100) (mkStdGen seed)

bigTree :: Tree Int
bigTree = bigTreeGen 123456789
