prettyTypeTestCases :: (String -> String -> IO ()) -> [Specs]
prettyTypeTestCases prettyFrom = 
  [ it "pretty prints a type variable" $
      "a" `prettyFrom` "a"
  , it "pretty prints a type name" $
      "Foo" `prettyFrom` "Foo"
  , it "pretty prints a type function" $
      "a, X, c -> c" `prettyFrom` "a, X, c -> c"
  , it "pretty prints a function with no parameters" $
      "-> Foo" `prettyFrom` "-> Foo"
  , it "strips off unnecessary parens" $
      "-> Foo" `prettyFrom` "(-> Foo)"
  , it "doesn't strip off necessary parens" $
      "a, (-> Int32) -> b" `prettyFrom` "a, (-> Int32) -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (f a) Int32 -> b" `prettyFrom` "a, Foo (f a) Int32 -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (a -> b) Int32 -> b" `prettyFrom` "a, Foo (a -> b) Int32 -> b"
  , it "doesn't strip off necessary parens in type call" $
      "Foo (Boo a) Int32" `prettyFrom` "Foo (Boo a) Int32"
  , it "works in weird cases" $
      "a -> (-> b)" `prettyFrom` "a -> (-> b)"
  ]
prettyTypeTestCases :: (String -> String -> IO ()) -> [Specs]
prettyTypeTestCases prettyFrom = 
  [ it "pretty prints a type variable" $
      "a" `prettyFrom` "a"
  , it "pretty prints a type name" $
      "Foo" `prettyFrom` "Foo"
  , it "pretty prints a type function" $
      "a, X, c -> c" `prettyFrom` "a, X, c -> c"
  , it "pretty prints a function with no parameters" $
      "-> Foo" `prettyFrom` "-> Foo"
  , it "strips off unnecessary parens" $
      "-> Foo" `prettyFrom` "(-> Foo)"
  , it "doesn't strip off necessary parens" $
      "a, (-> Int32) -> b" `prettyFrom` "a, (-> Int32) -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (f a) Int32 -> b" `prettyFrom` "a, Foo (f a) Int32 -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (a -> b) Int32 -> b" `prettyFrom` "a, Foo (a -> b) Int32 -> b"
  , it "doesn't strip off necessary parens in type call" $
      "Foo (Boo a) Int32" `prettyFrom` "Foo (Boo a) Int32"
  , it "works in weird cases" $
      "a -> (-> b)" `prettyFrom` "a -> (-> b)"
  ]
prettyTypeTestCases prettyFrom = 
  [ it "pretty prints a type variable" $
      "a" `prettyFrom` "a"
  , it "pretty prints a type name" $
      "Foo" `prettyFrom` "Foo"
  , it "pretty prints a type function" $
      "a, X, c -> c" `prettyFrom` "a, X, c -> c"
  , it "pretty prints a function with no parameters" $
      "-> Foo" `prettyFrom` "-> Foo"
  , it "strips off unnecessary parens" $
      "-> Foo" `prettyFrom` "(-> Foo)"
  , it "doesn't strip off necessary parens" $
      "a, (-> Int32) -> b" `prettyFrom` "a, (-> Int32) -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (f a) Int32 -> b" `prettyFrom` "a, Foo (f a) Int32 -> b"
  , it "doesn't strip off necessary parens in function type" $
      "a, Foo (a -> b) Int32 -> b" `prettyFrom` "a, Foo (a -> b) Int32 -> b"
  , it "doesn't strip off necessary parens in type call" $
      "Foo (Boo a) Int32" `prettyFrom` "Foo (Boo a) Int32"
  , it "works in weird cases" $
      "a -> (-> b)" `prettyFrom` "a -> (-> b)"
  ]