t
           y3 = Bin (Bin Leaf 432 Leaf) 123 Leaf ∷ Bin Int
       in do putStrLn "[*] Verbose:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", vwrite' x1]
             putStrLn $ unwords ["x1 =", show $ fromList x1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", vwrite' x2]
             putStrLn $ unwords ["x2 =", show $ fromList x2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", vwrite' x3]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", vwrite' y1]
             putStrLn $ unwords ["y1 =", show $ fromBin y1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", vwrite' y2]
             putStrLn $ unwords ["y2 =", show $ fromBin y2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", vwrite' y3]
             putStrLn $ unwords ["y3 =", show $ fromBin y3, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y3) == Just y3]

             putStrLn "[*] Compact:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", write' x1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", write' x2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", write' x3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", write' y1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", write' y2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", write' y3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y3) == Just y3]


test ∷ IO ()
test = let x1 = []       ∷ [Int]
           x2 = [1,2,3]  ∷ [Int]
           x3 = [1..100] ∷ [Int]
           y1 = Leaf                             ∷ Bin Int
           y2 = Bin Leaf 123 Leaf                ∷ Bin Int
           y3 = Bin (Bin Leaf 432 Leaf) 123 Leaf ∷ Bin Int
       in do putStrLn "[*] Verbose:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", vwrite' x1]
             putStrLn $ unwords ["x1 =", show $ fromList x1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", vwrite' x2]
             putStrLn $ unwords ["x2 =", show $ fromList x2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", vwrite' x3]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", vwrite' y1]
             putStrLn $ unwords ["y1 =", show $ fromBin y1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", vwrite' y2]
             putStrLn $ unwords ["y2 =", show $ fromBin y2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", vwrite' y3]
             putStrLn $ unwords ["y3 =", show $ fromBin y3, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y3) == Just y3]

             putStrLn "[*] Compact:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", write' x1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", write' x2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", write' x3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", write' y1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", write' y2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", write' y3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y3) == Just y3]
test = let x1 = []       ∷ [Int]
           x2 = [1,2,3]  ∷ [Int]
           x3 = [1..100] ∷ [Int]
           y1 = Leaf                             ∷ Bin Int
           y2 = Bin Leaf 123 Leaf                ∷ Bin Int
           y3 = Bin (Bin Leaf 432 Leaf) 123 Leaf ∷ Bin Int
       in do putStrLn "[*] Verbose:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", vwrite' x1]
             putStrLn $ unwords ["x1 =", show $ fromList x1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", vwrite' x2]
             putStrLn $ unwords ["x2 =", show $ fromList x2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", vwrite' x3]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", vwrite' y1]
             putStrLn $ unwords ["y1 =", show $ fromBin y1, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", vwrite' y2]
             putStrLn $ unwords ["y2 =", show $ fromBin y2, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", vwrite' y3]
             putStrLn $ unwords ["y3 =", show $ fromBin y3, "(says GHC)"]
             putStrLn $ unwords ["cycle ->", show $ vread' (vwrite' y3) == Just y3]

             putStrLn "[*] Compact:"
             putStrLn $ unwords ["x1 =", show x1]
             putStrLn $ unwords ["x1 =", write' x1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x1) == Just x1]

             putStrLn $ unwords ["x2 =", show x2]
             putStrLn $ unwords ["x2 =", write' x2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x2) == Just x2]

             putStrLn $ unwords ["x3 =", show x3]
             putStrLn $ unwords ["x3 =", write' x3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' x3) == Just x3]

             putStrLn $ unwords ["y1 =", show y1]
             putStrLn $ unwords ["y1 =", write' y1]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y1) == Just y1]

             putStrLn $ unwords ["y2 =", show y2]
             putStrLn $ unwords ["y2 =", write' y2]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y2) == Just y2]

             putStrLn $ unwords ["y3 =", show y3]
             putStrLn $ unwords ["y3 =", write' y3]
             putStrLn $ unwords ["cycle ->", show $ read' (write' y3) == Just y3]