text-show 0.7.0.1 → 0.8
raw patch · 171 files changed
+12825/−10005 lines, 171 filesdep +base-compatdep +base-orphansdep +hspecdep −tastydep −tasty-hunitdep −tasty-quickcheckdep ~basedep ~integer-gmpdep ~template-haskellsetup-changed
Dependencies added: base-compat, base-orphans, hspec
Dependencies removed: tasty, tasty-hunit, tasty-quickcheck
Dependency ranges changed: base, integer-gmp, template-haskell, text, text-show
Files
- CHANGELOG.md +99/−86
- LICENSE +30/−30
- README.md +25/−23
- Setup.hs +2/−2
- include/inline.h +12/−12
- include/overlap.h +18/−18
- include/utils.h +7/−7
- src/Text/Show/Text.hs +52/−52
- src/Text/Show/Text/Classes.hs +470/−476
- src/Text/Show/Text/Control.hs +0/−16
- src/Text/Show/Text/Control/Applicative.hs +57/−57
- src/Text/Show/Text/Control/Concurrent.hs +59/−59
- src/Text/Show/Text/Control/Exception.hs +299/−301
- src/Text/Show/Text/Control/Monad/ST.hs +38/−38
- src/Text/Show/Text/Data.hs +0/−43
- src/Text/Show/Text/Data/Array.hs +81/−80
- src/Text/Show/Text/Data/Bool.hs +28/−28
- src/Text/Show/Text/Data/ByteString.hs +92/−92
- src/Text/Show/Text/Data/Char.hs +109/−110
- src/Text/Show/Text/Data/Complex.hs +69/−66
- src/Text/Show/Text/Data/Data.hs +79/−79
- src/Text/Show/Text/Data/Dynamic.hs +38/−38
- src/Text/Show/Text/Data/Either.hs +38/−38
- src/Text/Show/Text/Data/Fixed.hs +92/−93
- src/Text/Show/Text/Data/Floating.hs +409/−392
- src/Text/Show/Text/Data/Functor/Identity.hs +42/−42
- src/Text/Show/Text/Data/Integral.hs +241/−249
- src/Text/Show/Text/Data/List.hs +32/−32
- src/Text/Show/Text/Data/Maybe.hs +38/−38
- src/Text/Show/Text/Data/Monoid.hs +141/−140
- src/Text/Show/Text/Data/OldTypeable.hs +78/−66
- src/Text/Show/Text/Data/Ord.hs +66/−62
- src/Text/Show/Text/Data/Proxy.hs +43/−43
- src/Text/Show/Text/Data/Ratio.hs +58/−44
- src/Text/Show/Text/Data/Text.hs +156/−67
- src/Text/Show/Text/Data/Tuple.hs +240/−240
- src/Text/Show/Text/Data/Type/Coercion.hs +52/−42
- src/Text/Show/Text/Data/Type/Equality.hs +53/−43
- src/Text/Show/Text/Data/Typeable.hs +105/−104
- src/Text/Show/Text/Data/Typeable/Utils.hs +32/−34
- src/Text/Show/Text/Data/Version.hs +53/−53
- src/Text/Show/Text/Data/Void.hs +36/−36
- src/Text/Show/Text/Debug/Trace.hs +368/−368
- src/Text/Show/Text/Debug/Trace/Generic.hs +50/−41
- src/Text/Show/Text/Debug/Trace/TH.hs +45/−45
- src/Text/Show/Text/Foreign.hs +0/−14
- src/Text/Show/Text/Foreign/C/Types.hs +479/−488
- src/Text/Show/Text/Foreign/Ptr.hs +117/−116
- src/Text/Show/Text/Functions.hs +37/−37
- src/Text/Show/Text/GHC.hs +0/−33
- src/Text/Show/Text/GHC/Conc/Windows.hs +42/−43
- src/Text/Show/Text/GHC/Event.hs +58/−57
- src/Text/Show/Text/GHC/Fingerprint.hs +53/−42
- src/Text/Show/Text/GHC/Generics.hs +197/−186
- src/Text/Show/Text/GHC/RTS/Flags.hs +268/−239
- src/Text/Show/Text/GHC/StaticPtr.hs +47/−37
- src/Text/Show/Text/GHC/Stats.hs +44/−34
- src/Text/Show/Text/GHC/TypeLits.hs +125/−105
- src/Text/Show/Text/Generic.hs +343/−318
- src/Text/Show/Text/Instances.hs +64/−19
- src/Text/Show/Text/Numeric.hs +0/−13
- src/Text/Show/Text/Numeric/Natural.hs +53/−53
- src/Text/Show/Text/System.hs +0/−15
- src/Text/Show/Text/System/Exit.hs +31/−31
- src/Text/Show/Text/System/IO.hs +160/−168
- src/Text/Show/Text/System/Posix/Types.hs +394/−399
- src/Text/Show/Text/TH.hs +17/−17
- src/Text/Show/Text/TH/Internal.hs +798/−784
- src/Text/Show/Text/Text.hs +0/−13
- src/Text/Show/Text/Text/Read.hs +79/−79
- src/Text/Show/Text/Utils.hs +85/−94
- tests/Derived.hs +463/−303
- tests/Instances/BaseAndFriends.hs +0/−632
- tests/Instances/Control/Applicative.hs +21/−0
- tests/Instances/Control/Concurrent.hs +33/−0
- tests/Instances/Control/Exception.hs +108/−0
- tests/Instances/Control/Monad/ST.hs +23/−0
- tests/Instances/Data/ByteString.hs +23/−0
- tests/Instances/Data/Char.hs +19/−0
- tests/Instances/Data/Data.hs +48/−0
- tests/Instances/Data/Dynamic.hs +23/−0
- tests/Instances/Data/Floating.hs +22/−0
- tests/Instances/Data/Functor/Identity.hs +20/−0
- tests/Instances/Data/Monoid.hs +35/−0
- tests/Instances/Data/OldTypeable.hs +37/−0
- tests/Instances/Data/Ord.hs +23/−0
- tests/Instances/Data/Proxy.hs +23/−0
- tests/Instances/Data/Text.hs +54/−0
- tests/Instances/Data/Tuple.hs +215/−0
- tests/Instances/Data/Type/Coercion.hs +27/−0
- tests/Instances/Data/Type/Equality.hs +28/−0
- tests/Instances/Data/Typeable.hs +49/−0
- tests/Instances/Data/Version.hs +23/−0
- tests/Instances/Derived.hs +380/−367
- tests/Instances/Foreign/C/Types.hs +142/−0
- tests/Instances/Foreign/Ptr.hs +34/−0
- tests/Instances/FromStringTextShow.hs +21/−0
- tests/Instances/GHC/Conc/Windows.hs +24/−0
- tests/Instances/GHC/Event.hs +28/−0
- tests/Instances/GHC/Fingerprint.hs +26/−0
- tests/Instances/GHC/Generics.hs +60/−0
- tests/Instances/GHC/RTS/Flags.hs +35/−0
- tests/Instances/GHC/StaticPtr.hs +22/−0
- tests/Instances/GHC/Stats.hs +31/−0
- tests/Instances/GHC/TypeLits.hs +53/−0
- tests/Instances/Generic.hs +28/−0
- tests/Instances/Numeric/Natural.hs +23/−0
- tests/Instances/System/Exit.hs +23/−0
- tests/Instances/System/IO.hs +70/−0
- tests/Instances/System/Posix/Types.hs +126/−0
- tests/Instances/Text/Read.hs +65/−0
- tests/Instances/Utils.hs +15/−15
- tests/Properties.hs +0/−31
- tests/Properties/BaseAndFriends.hs +0/−623
- tests/Properties/Builder.hs +0/−50
- tests/Properties/Derived.hs +0/−112
- tests/Properties/MkShow.hs +0/−133
- tests/Properties/Utils.hs +0/−64
- tests/Spec.hs +1/−0
- tests/Spec/BuilderSpec.hs +50/−0
- tests/Spec/Control/ApplicativeSpec.hs +38/−0
- tests/Spec/Control/ConcurrentSpec.hs +31/−0
- tests/Spec/Control/ExceptionSpec.hs +52/−0
- tests/Spec/Control/Monad/STSpec.hs +17/−0
- tests/Spec/Data/ArraySpec.hs +43/−0
- tests/Spec/Data/BoolSpec.hs +31/−0
- tests/Spec/Data/ByteStringSpec.hs +32/−0
- tests/Spec/Data/CharSpec.hs +35/−0
- tests/Spec/Data/ComplexSpec.hs +25/−0
- tests/Spec/Data/DataSpec.hs +31/−0
- tests/Spec/Data/DynamicSpec.hs +27/−0
- tests/Spec/Data/EitherSpec.hs +33/−0
- tests/Spec/Data/FixedSpec.hs +39/−0
- tests/Spec/Data/FloatingSpec.hs +54/−0
- tests/Spec/Data/Functor/IdentitySpec.hs +28/−0
- tests/Spec/Data/IntegralSpec.hs +64/−0
- tests/Spec/Data/ListSpec.hs +34/−0
- tests/Spec/Data/MaybeSpec.hs +33/−0
- tests/Spec/Data/MonoidSpec.hs +54/−0
- tests/Spec/Data/OldTypeableSpec.hs +46/−0
- tests/Spec/Data/OrdSpec.hs +41/−0
- tests/Spec/Data/ProxySpec.hs +32/−0
- tests/Spec/Data/RatioSpec.hs +25/−0
- tests/Spec/Data/TextSpec.hs +49/−0
- tests/Spec/Data/TupleSpec.hs +93/−0
- tests/Spec/Data/Type/CoercionSpec.hs +42/−0
- tests/Spec/Data/Type/EqualitySpec.hs +42/−0
- tests/Spec/Data/TypeableSpec.hs +28/−0
- tests/Spec/Data/VersionSpec.hs +25/−0
- tests/Spec/DerivedSpec.hs +119/−0
- tests/Spec/Foreign/C/TypesSpec.hs +55/−0
- tests/Spec/Foreign/PtrSpec.hs +42/−0
- tests/Spec/FromStringTextShowSpec.hs +65/−0
- tests/Spec/FunctionsSpec.hs +26/−0
- tests/Spec/GHC/Conc/WindowsSpec.hs +41/−0
- tests/Spec/GHC/EventSpec.hs +43/−0
- tests/Spec/GHC/FingerprintSpec.hs +43/−0
- tests/Spec/GHC/GenericsSpec.hs +69/−0
- tests/Spec/GHC/RTS/FlagsSpec.hs +82/−0
- tests/Spec/GHC/StaticPtrSpec.hs +41/−0
- tests/Spec/GHC/StatsSpec.hs +41/−0
- tests/Spec/GHC/TypeLitsSpec.hs +56/−0
- tests/Spec/GenericSpec.hs +42/−0
- tests/Spec/MkShowSpec.hs +134/−0
- tests/Spec/Numeric/NaturalSpec.hs +27/−0
- tests/Spec/System/ExitSpec.hs +27/−0
- tests/Spec/System/IOSpec.hs +62/−0
- tests/Spec/System/Posix/TypesSpec.hs +70/−0
- tests/Spec/Text/ReadSpec.hs +35/−0
- tests/Spec/Utils.hs +68/−0
- text-show.cabal +316/−216
CHANGELOG.md view
@@ -1,86 +1,99 @@-### 0.7.0.1 -* Disabled `print`-related tests, as they sporadically break referential transparency for unknown reasons -* Fixed build on Windows - -# 0.7 -* Added `showbConstPrec` (and corresponding `Show` and `Show1` instances for `Const`) to `Text.Show.Text.Control.Applicative` -* Added `showbUArrayPrec` (and corresponding `Show` instance for `UArray`s) and `showbIArrayPrec` to `Text.Data.Text.Data.Array`. -* Renamed `showbListDefault` to `showbListWith` to match how `Text.Show` names it -* Exposed `showbShortByteString` with all versions of `bytestring` by using the `bytestring-builder` package -* Corrected the `Show` instance for `Lexeme` (in `Text.Show.Text.Text.Read.Lex`) -* Fixed `TypeRep` output on GHC 7.10 and later -* The Template Haskell deriver now handles showable unlifted types (`Char#`, `Double#`, `Float#`, `Int#`, and `Word#`) correctly on GHC 7.12 and later -* Removed `LitChar` and `LitString` from `Text.Show.Text.Data.Char`, as they were not as useful as I had imagined. -* Removed the deprecated `replicateB` function -* `Typable` instances for `Show`, `Show1`, and `GShow` (with GHC 7.8 and later) -* `Typeable` instance for `ConType` -* Only derive `Eq` and `Ord` for `ConType` if a recent-enough version of `text` is used -* Changed the implementations of some functions in `Text.Show.Text.Debug.Trace` to use `ByteString`s instead of `String`s - -### 0.6.0.1 -* Forgot to include some header files in `text-show.cabal` - -# 0.6 -* `deriveShow` can now construct instances for data families, using either the data family name or a data instance constructor as an argument. See the documentation in `Text.Show.Text.TH` for more details. -* Fixed a bug in which infix backticked data constructors (e.g., ```data Add = Int `Plus` Int```) would not be shown correctly. -* Fixed typo in `Text.Show.Text.GHC.RTS.Flags` -* Removed the phantom-type detecting mechanism with `template-haskell-2.9.0.0` or higher. This method of finding phantom types is intrinsically flawed and is not usable on older GHCs. I plan on introducing a more robust mechanism for detecting phantom types on more versions of Template Haskell in `text-show-0.7`. -* Added generics support with the `Text.Show.Text.Generic` and `Text.Show.Text.Debug.Trace.Generic` modules -* Deprecated `replicateB` in favor of `timesN` from the `semigroups` library -* Added `FromTextShow` to `Text.Show.Text`, which admits a `String` `Show` instance for any data type with a `Text` `Show` instance (the counterpart of `FromStringShow`) -* Added `Monoid` and `Semigroup` instances for `FromStringShow`, `Semigroup` instance for `LitString`, `IsChar` instance for `LitChar`, and `IsString` instance for `[LitChar]` -* Changed the `String` `Show` instances of `FromStringShow`, `LitChar`, and `LitString` to more closely match the `Text` `Show` instances. As a result, the `Read` instances for these data types were also changed so that `read . show = read . show = id`. -* Removed the `recent-text` flag. We'll allow users to build with older versions of `text`, but the latest version is recommended. Because of this, the `integer-simple` and `integer-gmp` flags are not needed. -* Removed the `integer-gmp2` flag, as it supported a configuration that didn't actually compile on GHC -* Removed the `transformers-four` flag, as it is not needed now that `transformers-compat` is a dependency - -# 0.5 -* Fix build for GHC 7.10, old GHC versions, and Windows -* Removed the `Text.Show.Text.Data.Containers` and `Text.Show.Text.Data.Time` modules. The modules for the data types in `containers` and `time` were migrated to a separate library, `text-show-instances`. -* Removed the `-ftext-format` flag, as `text-show` no longer uses `text-format`. -* A [serious bug](https://github.com/bos/text/issues/99) in the `text` package that caused segfaults when building large `Integer`s was fixed in `text-1.2.0.2`. A flag (`-frecent-text`) was added that allows you to take advantage of this. -* Fixed a bug that would cause the output of functions in the `Text.Show.Text.Data.Floating` module to not match `base` depending on what version of `base` is used. -* The type signatures of lambda expressions generated by `mkShow` and related functions were loosened to allow them to be used to "manually" derive `Show` instances for data types with higher-kinded type parameters or type arguments with restricted `Show` instances. This should not be a breaking change; you can simply do more with `mkShow` et al. than you could before. For more information, see the documentation in `Text.Show.Text.TH`. -* Loosened the `Show` instance of `Complex a` to only depend on `Show a` (previously required `RealFloat a`) if using base-4.4.0.0 or later -* Moved `showbRatioPrec` to `Text.Show.Text.Data.Ratio`, `showbComplexPrec` to `Text.Show.Text.Data.Complex`, `showbProxy` to `Text.Show.Text.Data.Proxy`, and `showbFingerprint` to `Text.Show.Text.GHC.Fingerprint` -* Added `deriveShowPragmas` to `Text.Show.Text.TH` to allow users to specify `INLINE` or `SPECIALIZE instance` pragmas with `Show` instances. -* Added `FromStringShow`, `showbSpace`, `showbUnary`, `showbUnary1`, and `showbBinary1` to `Text.Show.Text` -* Added `mkShowList`, `mkShowListLazy`, and `mkShowbList` to `Text.Data.Text.TH` -* For base-4.8.0.0 and above, added the `Text.Show.Text.Data.Functor.Identity`, `Text.Show.Text.Data.Void`, `Text.Show.Text.GHC.RTS.Flags`, `Text.Show.Text.GHC.StaticPtr`, and `Text.Show.Text.Numeric.Natural` modules. Also added `Show` instances for `AllocationLimitExceeded` in `Text.Show.Text.Control.Exception` and `Alt` in `Text.Show.Text.Data.Monoid`. Also fixed the `Show` instance for `Fixed` values. -* Added the `Text.Show.Text.Data.GHC.Conc.Windows` module (Windows-only) -* Added the `Text.Show.Text.Data.OldTypeable` module for base-4.7 -* Added the `Text.Show.Text.GHC.TypeLits` module for base-4.6 and above -* Added the `Text.Show.Text.Debug.Trace` and `Text.Show.Text.Debug.Trace.TH` modules as an analog to `Debug.Trace` -* Added the `Show1` class and corresponding instances for unary type constructors. -* Added `LitChar` and `LitString` to `Text.Show.Text.Data.Char` -* Exported `asciiTabB` in `Text.Show.Text.Data.Char` -* Renamed `showbTextStrict` to 'showbText' (to keep with naming conventions in the `text` library) and added `showbBuilder` to `Text.Show.Text.Data.Text`. - -## 0.4.1 -* Added the utility functions `toText` and `toString` for working with `Builder`s. - -# 0.4 -* Due to [GHC bug #5289](http://ghc.haskell.org/trac/ghc/ticket/5289), projects that depend on the `double-conversion` library (such as `text-format`, a dependency of `text-show`) may break due to GHC incorrectly linking against libstdc++. Therefore, `text-show` was changed so that it does not depend on `text-format` by default. This behavior can be changed by using the `-ftext-format` flag when using `cabal`. -* Added `showbZonedTime` to `Text.Show.Text.Data.Time` (and corresponding `Show` instance for `ZonedTime`) -* Exposed `showbMaskingState` (is was already there, I just forgot to export it) -* If using GHC 7.6 or earlier, depend on tagged so that `Data.Proxy` (and thus `showbProxy` from `Text.Show.Text.Data.Typeable`) can be used -* Refactored code to use Template Haskell derivations when possible - -## 0.3.1.0 -* Added `showList` and `showListLazy` -* Don't use `showbListDefault` to show `containers` data types -* Added the ability to splice `show` functions for arbitrary data types (even if they aren't `Show` instances). These functions are `mkShow`, `mkShowLazy`, `mkShowPrec`, `mkShowPrecLazy`, `mkShowb`, `mkShowbPrec`, `mkPrint`, `mkPrintLazy`, `mkHPrint`, and `mkHPrintLazy`. - -# 0.3.0.0 -* Lots of bugfixes -* `Show` instances for many other data types in `base`, `containers` and `time` -* Exposed internal modules with monomorphic functions -* `Text.Show.Text` now exports `Data.Text.Lazy.Builder` for convenience -* Add `showLazy`, `showPrec`, `showPrecLazy`, `printLazy`, `hPrint`, `hPrintLazy`, `lengthB`, and `replicateB` -* Template Haskell derivation of `Show` instances (doesn't support data families yet) - -# 0.2.0.0 -* Added `Show` instances for strict and lazy `Text` - -# 0.1.0.0 -* Initial commit +# 0.8+* Exported `formatRealFloatB` and `formatRealFloatAltB` from `Text.Show.Text.Data.Floating`. Reexported `FPFormat` (from `text`) in the same module, and added a `Text` `Show` instance for it.+* The `Show` instance for `Ratio a` now only requires a `Show a` constraint if using `base-4.4.0.0` or later (if using `base-4.3.0.0`, it requires a `(Show a, Integral a)` constraint)+* Added `showbSingPrec` to `Text.Show.Text.GHC.TypeLits` (if using `base-4.6`)+* Modules which were previously exported only if using a recent-enough version of GHC/`base` (e.g., `Text.Show.Text.GHC.Generics`) are now always exposed. If the functionality that the module provides is not available on a given version of GHC/`base`, the module will not expose anything.+* Bump lower version bounds of `text` to 0.11.1 due to reexporting `FPFormat`+* Added `showbUnicodeException`, `showbI16Prec`, `showbDecodingPrec`, and `showbSizePrec` functions (and corresponding `Show` instances) to `Text.Show.Text.Data.Text`+* Made `GShow` in `Text.Show.Text.Generics` poly-kinded+* The Template Haskell deriver (and `GShow`) now handles "infix" data constructors that are applied as prefix correctly (e.g., `data Amp a = (:&) a a`)+* The Template Haskell deriver now handles showable unlifted types (`Char#`, `Double#`, `Float#`, `Int#`, and `Word#`) correctly on GHC 7.11 and later+* The Template Haskell derive now does not parenthesize record types regardless of precedence on GHC 7.11 and later+* Fixed build on GHC 7.2+* Changed test-suite to use `hspec`, which allows for it to be built on GHC 7.0 and 7.2++### 0.7.0.1+* Disabled `print`-related tests, as they sporadically break referential transparency for unknown reasons+* Fixed build on Windows++# 0.7+* Added `showbConstPrec` (and corresponding `Show` and `Show1` instances for `Const`) to `Text.Show.Text.Control.Applicative`+* Added `showbUArrayPrec` (and corresponding `Show` instance for `UArray`s) and `showbIArrayPrec` to `Text.Data.Text.Data.Array`.+* Renamed `showbListDefault` to `showbListWith` to match how `Text.Show` names it+* Exposed `showbShortByteString` with all versions of `bytestring` by using the `bytestring-builder` package+* Corrected the `Show` instance for `Lexeme` (in `Text.Show.Text.Text.Read.Lex`)+* Fixed `TypeRep` output on GHC 7.10 and later+* Removed `LitChar` and `LitString` from `Text.Show.Text.Data.Char`, as they were not as useful as I had imagined.+* Removed the deprecated `replicateB` function+* `Typable` instances for `Show`, `Show1`, and `GShow` (with GHC 7.8 and later)+* `Typeable` instance for `ConType`+* Only derive `Eq` and `Ord` for `ConType` if a recent-enough version of `text` is used+* Changed the implementations of some functions in `Text.Show.Text.Debug.Trace` to use `ByteString`s instead of `String`s++### 0.6.0.1+* Forgot to include some header files in `text-show.cabal`++# 0.6+* `deriveShow` can now construct instances for data families, using either the data family name or a data instance constructor as an argument. See the documentation in `Text.Show.Text.TH` for more details.+* Fixed a bug in which infix backticked data constructors (e.g., ```data Add = Int `Plus` Int```) would not be shown correctly.+* Fixed typo in `Text.Show.Text.GHC.RTS.Flags`+* Removed the phantom-type detecting mechanism with `template-haskell-2.9.0.0` or higher. This method of finding phantom types is intrinsically flawed and is not usable on older GHCs. I plan on introducing a more robust mechanism for detecting phantom types on more versions of Template Haskell in `text-show-0.7`.+* Added generics support with the `Text.Show.Text.Generic` and `Text.Show.Text.Debug.Trace.Generic` modules+* Deprecated `replicateB` in favor of `timesN` from the `semigroups` library+* Added `FromTextShow` to `Text.Show.Text`, which admits a `String` `Show` instance for any data type with a `Text` `Show` instance (the counterpart of `FromStringShow`)+* Added `Monoid` and `Semigroup` instances for `FromStringShow`, `Semigroup` instance for `LitString`, `IsChar` instance for `LitChar`, and `IsString` instance for `[LitChar]`+* Changed the `String` `Show` instances of `FromStringShow`, `LitChar`, and `LitString` to more closely match the `Text` `Show` instances. As a result, the `Read` instances for these data types were also changed so that `read . show = read . show = id`.+* Removed the `recent-text` flag. We'll allow users to build with older versions of `text`, but the latest version is recommended. Because of this, the `integer-simple` and `integer-gmp` flags are not needed.+* Removed the `integer-gmp2` flag, as it supported a configuration that didn't actually compile on GHC+* Removed the `transformers-four` flag, as it is not needed now that `transformers-compat` is a dependency++# 0.5+* Fix build for GHC 7.10, old GHC versions, and Windows+* Removed the `Text.Show.Text.Data.Containers` and `Text.Show.Text.Data.Time` modules. The modules for the data types in `containers` and `time` were migrated to a separate library, `text-show-instances`.+* Removed the `-ftext-format` flag, as `text-show` no longer uses `text-format`.+* A [serious bug](https://github.com/bos/text/issues/99) in the `text` package that caused segfaults when building large `Integer`s was fixed in `text-1.2.0.2`. A flag (`-frecent-text`) was added that allows you to take advantage of this.+* Fixed a bug that would cause the output of functions in the `Text.Show.Text.Data.Floating` module to not match `base` depending on what version of `base` is used.+* The type signatures of lambda expressions generated by `mkShow` and related functions were loosened to allow them to be used to "manually" derive `Show` instances for data types with higher-kinded type parameters or type arguments with restricted `Show` instances. This should not be a breaking change; you can simply do more with `mkShow` et al. than you could before. For more information, see the documentation in `Text.Show.Text.TH`.+* Loosened the `Show` instance of `Complex a` to only depend on `Show a` (previously required `RealFloat a`) if using base-4.4.0.0 or later+* Moved `showbRatioPrec` to `Text.Show.Text.Data.Ratio`, `showbComplexPrec` to `Text.Show.Text.Data.Complex`, `showbProxy` to `Text.Show.Text.Data.Proxy`, and `showbFingerprint` to `Text.Show.Text.GHC.Fingerprint`+* Added `deriveShowPragmas` to `Text.Show.Text.TH` to allow users to specify `INLINE` or `SPECIALIZE instance` pragmas with `Show` instances.+* Added `FromStringShow`, `showbSpace`, `showbUnary`, `showbUnary1`, and `showbBinary1` to `Text.Show.Text`+* Added `mkShowList`, `mkShowListLazy`, and `mkShowbList` to `Text.Data.Text.TH`+* For base-4.8.0.0 and above, added the `Text.Show.Text.Data.Functor.Identity`, `Text.Show.Text.Data.Void`, `Text.Show.Text.GHC.RTS.Flags`, `Text.Show.Text.GHC.StaticPtr`, and `Text.Show.Text.Numeric.Natural` modules. Also added `Show` instances for `AllocationLimitExceeded` in `Text.Show.Text.Control.Exception` and `Alt` in `Text.Show.Text.Data.Monoid`. Also fixed the `Show` instance for `Fixed` values.+* Added the `Text.Show.Text.Data.GHC.Conc.Windows` module (Windows-only)+* Added the `Text.Show.Text.Data.OldTypeable` module for base-4.7+* Added the `Text.Show.Text.GHC.TypeLits` module for base-4.6 and above+* Added the `Text.Show.Text.Debug.Trace` and `Text.Show.Text.Debug.Trace.TH` modules as an analog to `Debug.Trace`+* Added the `Show1` class and corresponding instances for unary type constructors.+* Added `LitChar` and `LitString` to `Text.Show.Text.Data.Char`+* Exported `asciiTabB` in `Text.Show.Text.Data.Char`+* Renamed `showbTextStrict` to 'showbText' (to keep with naming conventions in the `text` library) and added `showbBuilder` to `Text.Show.Text.Data.Text`.++## 0.4.1+* Added the utility functions `toText` and `toString` for working with `Builder`s.++# 0.4+* Due to [GHC bug #5289](http://ghc.haskell.org/trac/ghc/ticket/5289), projects that depend on the `double-conversion` library (such as `text-format`, a dependency of `text-show`) may break due to GHC incorrectly linking against libstdc++. Therefore, `text-show` was changed so that it does not depend on `text-format` by default. This behavior can be changed by using the `-ftext-format` flag when using `cabal`.+* Added `showbZonedTime` to `Text.Show.Text.Data.Time` (and corresponding `Show` instance for `ZonedTime`)+* Exposed `showbMaskingState` (is was already there, I just forgot to export it)+* If using GHC 7.6 or earlier, depend on tagged so that `Data.Proxy` (and thus `showbProxy` from `Text.Show.Text.Data.Typeable`) can be used+* Refactored code to use Template Haskell derivations when possible++## 0.3.1.0+* Added `showList` and `showListLazy`+* Don't use `showbListDefault` to show `containers` data types+* Added the ability to splice `show` functions for arbitrary data types (even if they aren't `Show` instances). These functions are `mkShow`, `mkShowLazy`, `mkShowPrec`, `mkShowPrecLazy`, `mkShowb`, `mkShowbPrec`, `mkPrint`, `mkPrintLazy`, `mkHPrint`, and `mkHPrintLazy`.++# 0.3.0.0+* Lots of bugfixes+* `Show` instances for many other data types in `base`, `containers` and `time`+* Exposed internal modules with monomorphic functions+* `Text.Show.Text` now exports `Data.Text.Lazy.Builder` for convenience+* Add `showLazy`, `showPrec`, `showPrecLazy`, `printLazy`, `hPrint`, `hPrintLazy`, `lengthB`, and `replicateB`+* Template Haskell derivation of `Show` instances (doesn't support data families yet)++# 0.2.0.0+* Added `Show` instances for strict and lazy `Text`++# 0.1.0.0+* Initial commit
LICENSE view
@@ -1,30 +1,30 @@-Copyright (c) 2014, Ryan Scott - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of Ryan Scott nor the names of other - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2014, Ryan Scott++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Ryan Scott nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
README.md view
@@ -1,23 +1,25 @@-# `text-show` [](http://hackage.haskell.org/package/text-show) [](https://travis-ci.org/RyanGlScott/text-show) - -`text-show` offers a replacement for the `Show` typeclass intended for use with `Text` instead of `String`s. This package was created in the spirit of [`bytestring-show`](http://hackage.haskell.org/package/bytestring-show). - -At the moment, `text-show` provides `Show` instances for most data types in the [`array`](http://hackage.haskell.org/package/array), [`base`](http://hackage.haskell.org/package/base), [`bytestring`](http://hackage.haskell.org/package/bytestring), and [`text`](http://hackage.haskell.org/package/text) packages. Therefore, much of the source code for `text-show` consists of borrowed code from those packages in order to ensure that the behaviors of the two `Show` typeclasses coincide. - -For most uses, simply importing `Text.Show.Text` will suffice: - -```haskell -module Main where - -import Data.Text (Text) -import Prelude hiding (Show(..), print) -import Text.Show.Text - -hello :: Text -hello = show (Just "Hello, World!") - -main :: IO () -main = print hello -``` - -If you desire it, there are also monomorphic versions of the `showb` function available in the submodules of `Text.Show.Text`. A naming convention is present in which functions that show different values depending on the precedence end with `Prec`(e.g., `showbIntPrec`), whereas functions that show the same values regardless of precedence do not end with `Prec` (e.g., `showbBool`). +# `text-show` [](http://hackage.haskell.org/package/text-show) [](https://travis-ci.org/RyanGlScott/text-show)++`text-show` offers a replacement for the `Show` typeclass intended for use with `Text` instead of `String`s. This package was created in the spirit of [`bytestring-show`](http://hackage.haskell.org/package/bytestring-show).++At the moment, `text-show` provides `Show` instances for most data types in the [`array`](http://hackage.haskell.org/package/array), [`base`](http://hackage.haskell.org/package/base), [`bytestring`](http://hackage.haskell.org/package/bytestring), and [`text`](http://hackage.haskell.org/package/text) packages. Therefore, much of the source code for `text-show` consists of borrowed code from those packages in order to ensure that the behaviors of the two `Show` typeclasses coincide.++For most uses, simply importing `Text.Show.Text` will suffice:++```haskell+module Main where++import Data.Text (Text)+import Prelude hiding (Show(..), print)+import Text.Show.Text++hello :: Text+hello = show (Just "Hello, World!")++main :: IO ()+main = print hello+```++If you desire it, there are also monomorphic versions of the `showb` function available in the submodules of `Text.Show.Text`. A naming convention is present in which functions that show different values depending on the precedence end with `Prec`(e.g., `showbIntPrec`), whereas functions that show the same values regardless of precedence do not end with `Prec` (e.g., `showbBool`).++Support for automatically deriving `Show` instances can be found in the `Text.Show.Text.TH` and `Text.Show.Text.Generic` modules. If you don't know which one to use, use `Text.Show.Text.TH`.
Setup.hs view
@@ -1,2 +1,2 @@-import Distribution.Simple -main = defaultMain +import Distribution.Simple+main = defaultMain
include/inline.h view
@@ -1,12 +1,12 @@-#ifndef INLINE_H -#define INLINE_H - -#include "utils.h" - -#if __GLASGOW_HASKELL__ >= 702 -# define INLINE_INST_FUN(F) OPEN_PRAGMA INLINE F CLOSE_PRAGMA -#else -# define INLINE_INST_FUN(F) -#endif - -#endif +#ifndef INLINE_H+#define INLINE_H++#include "utils.h"++#if __GLASGOW_HASKELL__ > 702+# define INLINE_INST_FUN(F) OPEN_PRAGMA INLINE F CLOSE_PRAGMA+#else+# define INLINE_INST_FUN(F)+#endif++#endif
include/overlap.h view
@@ -1,18 +1,18 @@-#ifndef OVERLAP_H -#define OVERLAP_H - -#include "utils.h" - -#if __GLASGOW_HASKELL__ >= 710 -# define __LANGUAGE_OVERLAPPING_INSTANCES__ -# define __OVERLAPPABLE__ OPEN_PRAGMA OVERLAPPABLE CLOSE_PRAGMA -# define __OVERLAPPING__ OPEN_PRAGMA OVERLAPPING CLOSE_PRAGMA -# define __OVERLAPS__ OPEN_PRAGMA OVERLAPPABLE CLOSE_PRAGMA -#else -# define __LANGUAGE_OVERLAPPING_INSTANCES__ OPEN_PRAGMA LANGUAGE OverlappingInstances CLOSE_PRAGMA -# define __OVERLAPPABLE__ -# define __OVERLAPPING__ -# define __OVERLAPS__ -#endif - -#endif +#ifndef OVERLAP_H+#define OVERLAP_H++#include "utils.h"++#if __GLASGOW_HASKELL__ >= 710+# define __LANGUAGE_OVERLAPPING_INSTANCES__+# define __OVERLAPPABLE__ OPEN_PRAGMA OVERLAPPABLE CLOSE_PRAGMA+# define __OVERLAPPING__ OPEN_PRAGMA OVERLAPPING CLOSE_PRAGMA+# define __OVERLAPS__ OPEN_PRAGMA OVERLAPPABLE CLOSE_PRAGMA+#else+# define __LANGUAGE_OVERLAPPING_INSTANCES__ OPEN_PRAGMA LANGUAGE OverlappingInstances CLOSE_PRAGMA+# define __OVERLAPPABLE__+# define __OVERLAPPING__+# define __OVERLAPS__+#endif++#endif
include/utils.h view
@@ -1,7 +1,7 @@-#ifndef UTILS_H -#define UTILS_H - -#define OPEN_PRAGMA {-# -#define CLOSE_PRAGMA #-} - -#endif +#ifndef UTILS_H+#define UTILS_H++#define OPEN_PRAGMA {-#+#define CLOSE_PRAGMA #-}++#endif
src/Text/Show/Text.hs view
@@ -1,52 +1,52 @@-{-| -Module: Text.Show.Text -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Efficiently convert from values to 'Text' via 'Builder's. - -/Since: 0.1/ --} -module Text.Show.Text ( - -- * The 'Show' class - Show(..) - , show - , showLazy - , showPrec - , showPrecLazy - , showList - , showListLazy - , showbParen - , showbSpace - , showbUnary - , Show1(..) - , showbUnary1 - , showbBinary1 - -- * 'Builder's - , module Data.Text.Lazy.Builder - , toString - , toText - , lengthB - , unlinesB - , unwordsB - -- * Printing values - , print - , printLazy - , hPrint - , hPrintLazy - -- * Conversion between @String@ and @Text@ 'Show' - , FromStringShow(..) - , FromTextShow(..) - ) where - -import Data.Text.Lazy.Builder - -import Prelude hiding (Show(show, showList), print) - -import Text.Show.Text.Classes -import Text.Show.Text.Instances () -import Text.Show.Text.Utils (toString, toText, lengthB, - unlinesB, unwordsB) +{-|+Module: Text.Show.Text+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Efficiently convert from values to 'Text' via 'Builder's.++/Since: 0.1/+-}+module Text.Show.Text (+ -- * The 'Show' class+ Show(..)+ , show+ , showLazy+ , showPrec+ , showPrecLazy+ , showList+ , showListLazy+ , showbParen+ , showbSpace+ , showbUnary+ , Show1(..)+ , showbUnary1+ , showbBinary1+ -- * 'Builder's+ , module Data.Text.Lazy.Builder+ , toString+ , toText+ , lengthB+ , unlinesB+ , unwordsB+ -- * Printing values+ , print+ , printLazy+ , hPrint+ , hPrintLazy+ -- * Conversion between @String@ and @Text@ 'Show'+ , FromStringShow(..)+ , FromTextShow(..)+ ) where++import Data.Text.Lazy.Builder++import Prelude ()++import Text.Show.Text.Classes+import Text.Show.Text.Instances ()+import Text.Show.Text.Utils (toString, toText, lengthB,+ unlinesB, unwordsB)
src/Text/Show/Text/Classes.hs view
@@ -1,476 +1,470 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE DeriveFoldable #-} -{-# LANGUAGE DeriveFunctor #-} -{-# LANGUAGE DeriveTraversable #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE OverloadedStrings #-} - -#if MIN_VERSION_base(4,4,0) -{-# LANGUAGE DeriveGeneric #-} -#endif - -#if __GLASGOW_HASKELL__ >= 708 -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TypeFamilies #-} -#endif -{-| -Module: Text.Show.Text.Classes -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -The 'Show' and 'Show1' typeclasses. --} -module Text.Show.Text.Classes where - -#if !(MIN_VERSION_base(4,8,0)) -import Control.Applicative (Applicative((<*>), pure)) -import Data.Foldable (Foldable) -import Data.Functor ((<$>)) -import Data.Monoid (Monoid) -import Data.Traversable (Traversable) -#endif - -import Control.Monad.Fix (MonadFix(..)) -#if MIN_VERSION_base(4,4,0) -import Control.Monad.Zip (MonadZip(..)) -#endif - -import Data.Bits (Bits) -#if MIN_VERSION_base(4,7,0) -import Data.Bits (FiniteBits) -#endif -import Data.Data (Data, Typeable) -import Data.Ix (Ix) -import Data.Semigroup (Semigroup) -import Data.String (IsString) -import Data.Text as TS (Text) -import qualified Data.Text.IO as TS (putStrLn, hPutStrLn) -import qualified Data.Text.Lazy as TL (Text) -import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn) -import Data.Text.Lazy (toStrict) -import Data.Text.Lazy.Builder (Builder, fromString, toLazyText) - -import Foreign.Storable (Storable) - -#if __GLASGOW_HASKELL__ >= 708 -import GHC.Exts (IsList(Item, fromList, toList)) -#endif -#if MIN_VERSION_base(4,4,0) -import GHC.Generics (Generic) -# if __GLASGOW_HASKELL__ >= 706 -import GHC.Generics (Generic1) -# endif -#endif -import GHC.Show (appPrec, appPrec1) - -import Prelude hiding (Show(..)) - -import System.IO (Handle) - -import Text.Printf (PrintfArg, PrintfType) -import Text.Read (Read(..), readListPrecDefault) -import qualified Text.Show as S (Show(..)) -import Text.Show.Text.Utils ((<>), s, toString) - -#include "inline.h" - --- | Conversion of values to @Text@. Because there are both strict and lazy @Text@ --- variants, the 'Show' class deliberately avoids using @Text@ in its functions. --- Instead, 'showbPrec', 'showb', and 'showbList' all return 'Builder', an --- efficient intermediate form that can be converted to either kind of @Text@. --- --- 'Builder' is a 'Monoid', so it is useful to use the 'mappend' (or '<>') function --- to combine 'Builder's when creating 'Show' instances. As an example: --- --- @ --- import Text.Show.Text --- --- data Example = Example Int Int --- instance Show Example where --- showb (Example i1 i2) = showb i1 <> showbSpace <> showb i2 --- @ --- --- If you do not want to create 'Show' instances manually, you can alternatively --- use the "Text.Show.Text.TH" module to automatically generate default 'Show' --- instances using Template Haskell, or the "Text.Show.Text.Generic" module to --- quickly define 'Show' instances using 'genericShowbPrec'. --- --- /Since: 0.1/ -class Show a where - -- | Convert a value to a 'Builder' with the given predence. - -- - -- /Since: 0.1/ - showbPrec :: Int -- ^ The operator precedence of the enclosing context (a number - -- from @0@ to @11@). Function application has precedence @10@. - -> a -- ^ The value to be converted to a 'String'. - -> Builder - - -- | A specialized variant of 'showbPrec' using precedence context zero. - -- - -- /Since: 0.1/ - showb :: a -> Builder - - -- | Allows for specialized display of lists. This is used, for example, when - -- showing lists of 'Char's. - -- - -- /Since: 0.1/ - showbList :: [a] -> Builder - - showbPrec _ = showb - - showb = showbPrec 0 - - showbList = showbListWith showb -#if __GLASGOW_HASKELL__ >= 708 - {-# MINIMAL showbPrec | showb #-} - -deriving instance Typeable Show -#endif - --- | Lifting of the 'Show' class to unary type constructors. --- --- /Since: 0.5/ -class Show1 f where - -- | 'Builder' conversion for values of a type that has a unary type constructor. - -- - -- /Since: 0.5/ - showbPrec1 :: Show a => Int -> f a -> Builder - -#if __GLASGOW_HASKELL__ >= 708 -deriving instance Typeable Show1 -#endif - --- | Constructs a strict 'TS.Text' from a single value. --- --- /Since: 0.1/ -show :: Show a => a -> TS.Text -show = toStrict . showLazy -{-# INLINE show #-} - --- | Constructs a lazy 'TL.Text' from a single value. --- --- /Since: 0.3/ -showLazy :: Show a => a -> TL.Text -showLazy = toLazyText . showb -{-# INLINE showLazy #-} - --- | Constructs a strict 'TS.Text' from a single value with the given precedence. --- --- /Since: 0.3/ -showPrec :: Show a => Int -> a -> TS.Text -showPrec p = toStrict . showPrecLazy p -{-# INLINE showPrec #-} - --- | Constructs a lazy 'TL.Text' from a single value with the given precedence. --- --- /Since: 0.3/ -showPrecLazy :: Show a => Int -> a -> TL.Text -showPrecLazy p = toLazyText . showbPrec p -{-# INLINE showPrecLazy #-} - --- | Construct a strict 'TS.Text' from a list of values. --- --- /Since: 0.3.1/ -showList :: Show a => [a] -> TS.Text -showList = toStrict . showListLazy -{-# INLINE showList #-} - --- | Construct a lazy 'TL.Text' from a list of values. --- --- /Since: 0.3.1/ -showListLazy :: Show a => [a] -> TL.Text -showListLazy = toLazyText . showbList -{-# INLINE showListLazy #-} - --- | Surrounds 'Builder' output with parentheses if the 'Bool' parameter is 'True'. --- --- /Since: 0.1/ -showbParen :: Bool -> Builder -> Builder -showbParen p builder | p = s '(' <> builder <> s ')' - | otherwise = builder -{-# INLINE showbParen #-} - --- | Construct a 'Builder' containing a single space character. --- --- /Since: 0.5/ -showbSpace :: Builder -showbSpace = s ' ' -{-# INLINE showbSpace #-} - --- | Converts a list of values into a 'Builder' in which the values are surrounded --- by square brackets and each value is separated by a comma. The function argument --- controls how each element is shown. - --- @'showbListWith' 'showb'@ is the default implementation of 'showbList' save for --- a few special cases (e.g., 'String'). --- --- /Since: 0.7/ -showbListWith :: (a -> Builder) -> [a] -> Builder -showbListWith _ [] = "[]" -showbListWith showbx (x:xs) = s '[' <> showbx x <> go xs -- "[.. - where - go (y:ys) = s ',' <> showbx y <> go ys -- ..,.. - go [] = s ']' -- ..]" -{-# INLINE showbListWith #-} - --- | @'showbUnary' n p x@ produces the 'Builder' representation of a unary data --- constructor with name @n@ and argument @x@, in precedence context @p@. --- --- /Since: 0.5/ -showbUnary :: Show a => Builder -> Int -> a -> Builder -showbUnary nameB p x = showbParen (p > appPrec) $ - nameB <> showbSpace <> showbPrec appPrec1 x -{-# INLINE showbUnary #-} - --- | @'showbUnary1' n p x@ produces the 'Builder' representation of a unary data --- constructor with name @n@ and argument @x@, in precedence context @p@. --- --- /Since: 0.5/ -showbUnary1 :: (Show1 f, Show a) => Builder -> Int -> f a -> Builder -showbUnary1 nameB p x = showbParen (p > appPrec) $ - nameB <> showbSpace <> showbPrec1 appPrec1 x -{-# INLINE showbUnary1 #-} - --- | @'showbBinary1' n p x y@ produces the 'Builder' representation of a binary --- data constructor with name @n@ and arguments @x@ and @y@, in precedence --- context @p@. --- --- /Since: 0.5/ -showbBinary1 :: (Show1 f, Show1 g, Show a) => Builder -> Int -> f a -> g a -> Builder -showbBinary1 nameB p x y = showbParen (p > appPrec) $ nameB - <> showbSpace <> showbPrec1 appPrec1 x - <> showbSpace <> showbPrec1 appPrec1 y -{-# INLINE showbBinary1 #-} - --- | Writes a value's strict 'TS.Text' representation to the standard output, followed --- by a newline. --- --- /Since: 0.1/ -print :: Show a => a -> IO () -print = TS.putStrLn . show -{-# INLINE print #-} - --- | Writes a value's lazy 'TL.Text' representation to the standard output, followed --- by a newline. --- --- /Since: 0.3/ -printLazy :: Show a => a -> IO () -printLazy = TL.putStrLn . showLazy -{-# INLINE printLazy #-} - --- | Writes a value's strict 'TS.Text' representation to a file handle, followed --- by a newline. --- --- /Since: 0.3/ -hPrint :: Show a => Handle -> a -> IO () -hPrint h = TS.hPutStrLn h . show -{-# INLINE hPrint #-} - --- | Writes a value's lazy 'TL.Text' representation to a file handle, followed --- by a newline. --- --- /Since: 0.3/ -hPrintLazy :: Show a => Handle -> a -> IO () -hPrintLazy h = TL.hPutStrLn h . showLazy -{-# INLINE hPrintLazy #-} - --- | The @Text@ 'T.Show' instance for 'FromStringShow' is based on its @String@ --- 'S.Show' instance. That is, --- --- @ --- showbPrec p ('FromStringShow' x) = 'fromString' (showsPrec p x "") --- @ --- --- /Since: 0.5/ -newtype FromStringShow a = FromStringShow { fromStringShow :: a } - deriving ( Bits - , Bounded - , Data - , Enum - , Eq -#if MIN_VERSION_base(4,7,0) - , FiniteBits -#endif - , Floating - , Foldable - , Fractional - , Functor -#if MIN_VERSION_base(4,4,0) - , Generic -# if __GLASGOW_HASKELL__ >= 706 - , Generic1 -# endif -#endif - , Integral - , IsString - , Ix - , Monoid - , Num - , Ord - , PrintfArg - , PrintfType - , Real - , RealFloat - , RealFrac - , Semigroup - , Storable - , Traversable - , Typeable - ) - -instance Applicative FromStringShow where - pure = FromStringShow - INLINE_INST_FUN(pure) - - FromStringShow f <*> FromStringShow x = FromStringShow $ f x - INLINE_INST_FUN((<*>)) - -#if __GLASGOW_HASKELL__ >= 708 -instance IsList a => IsList (FromStringShow a) where - type Item (FromStringShow a) = Item a - fromList = FromStringShow . fromList - {-# INLINE fromList #-} - toList = toList . fromStringShow - {-# INLINE toList #-} -#endif - -instance Monad FromStringShow where - return = FromStringShow - INLINE_INST_FUN(return) - - FromStringShow a >>= f = f a - INLINE_INST_FUN((>>=)) - -instance MonadFix FromStringShow where - mfix f = FromStringShow $ let FromStringShow a = f a in a - INLINE_INST_FUN(mfix) - -#if MIN_VERSION_base(4,4,0) -instance MonadZip FromStringShow where - mzip (FromStringShow a) (FromStringShow b) = FromStringShow (a, b) - INLINE_INST_FUN(mzip) - - mzipWith f (FromStringShow a) (FromStringShow b) = FromStringShow $ f a b - INLINE_INST_FUN(mzipWith) - - munzip (FromStringShow (a, b)) = (FromStringShow a, FromStringShow b) - INLINE_INST_FUN(munzip) -#endif - -instance Read a => Read (FromStringShow a) where - readPrec = FromStringShow <$> readPrec - INLINE_INST_FUN(readPrec) - - readListPrec = readListPrecDefault - INLINE_INST_FUN(readListPrec) - -instance S.Show a => Show (FromStringShow a) where - showbPrec p (FromStringShow x) = fromString $ S.showsPrec p x "" - INLINE_INST_FUN(showbPrec) - -instance S.Show a => S.Show (FromStringShow a) where - showsPrec p (FromStringShow x) = S.showsPrec p x - INLINE_INST_FUN(showsPrec) - --- | The @String@ 'S.Show' instance for 'FromTextShow' is based on its @Text@ --- 'T.Show' instance. That is, --- --- @ --- showsPrec p ('FromTextShow' x) str = 'toString' (showbPrec p x) ++ str --- @ --- --- /Since: 0.6/ -newtype FromTextShow a = FromTextShow { fromTextShow :: a } - deriving ( Bits - , Bounded - , Data - , Enum - , Eq -#if MIN_VERSION_base(4,7,0) - , FiniteBits -#endif - , Floating - , Foldable - , Fractional - , Functor -#if MIN_VERSION_base(4,4,0) - , Generic -# if __GLASGOW_HASKELL__ >= 706 - , Generic1 -# endif -#endif - , Integral - , IsString - , Ix - , Monoid - , Num - , Ord - , PrintfArg - , PrintfType - , Real - , RealFloat - , RealFrac - , Semigroup - , Show - , Storable - , Traversable - , Typeable - ) - -instance Applicative FromTextShow where - pure = FromTextShow - INLINE_INST_FUN(pure) - - FromTextShow f <*> FromTextShow x = FromTextShow $ f x - INLINE_INST_FUN((<*>)) - -#if __GLASGOW_HASKELL__ >= 708 -instance IsList a => IsList (FromTextShow a) where - type Item (FromTextShow a) = Item a - fromList = FromTextShow . fromList - {-# INLINE fromList #-} - toList = toList . fromTextShow - {-# INLINE toList #-} -#endif - -instance Monad FromTextShow where - return = FromTextShow - INLINE_INST_FUN(return) - - FromTextShow a >>= f = f a - INLINE_INST_FUN((>>=)) - -instance MonadFix FromTextShow where - mfix f = FromTextShow $ let FromTextShow a = f a in a - INLINE_INST_FUN(mfix) - -#if MIN_VERSION_base(4,4,0) -instance MonadZip FromTextShow where - mzip (FromTextShow a) (FromTextShow b) = FromTextShow (a, b) - INLINE_INST_FUN(mzip) - - mzipWith f (FromTextShow a) (FromTextShow b) = FromTextShow $ f a b - INLINE_INST_FUN(mzipWith) - - munzip (FromTextShow (a, b)) = (FromTextShow a, FromTextShow b) - INLINE_INST_FUN(munzip) -#endif - -instance Read a => Read (FromTextShow a) where - readPrec = FromTextShow <$> readPrec - INLINE_INST_FUN(readPrec) - - readListPrec = readListPrecDefault - INLINE_INST_FUN(readListPrec) - -instance Show a => S.Show (FromTextShow a) where - showsPrec p (FromTextShow x) str = toString (showbPrec p x) ++ str - INLINE_INST_FUN(showsPrec) - -instance Show1 FromTextShow where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}++#if MIN_VERSION_base(4,4,0)+{-# LANGUAGE DeriveGeneric #-}+#endif++#if __GLASGOW_HASKELL__ >= 708+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+#endif+{-|+Module: Text.Show.Text.Classes+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++The 'Show' and 'Show1' typeclasses.+-}+module Text.Show.Text.Classes where++import Control.Monad.Fix (MonadFix(..))+#if MIN_VERSION_base(4,4,0)+import Control.Monad.Zip (MonadZip(..))+#endif++import Data.Bits (Bits)+#if MIN_VERSION_base(4,7,0)+import Data.Bits (FiniteBits)+#endif+import Data.Data (Data, Typeable)+import Data.Ix (Ix)+import Data.Monoid.Compat ((<>))+import Data.Semigroup (Semigroup)+import Data.String (IsString)+import Data.Text as TS (Text)+import qualified Data.Text.IO as TS (putStrLn, hPutStrLn)+import qualified Data.Text.Lazy as TL (Text)+import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn)+import Data.Text.Lazy (toStrict)+import Data.Text.Lazy.Builder (Builder, fromString, toLazyText)++import Foreign.Storable (Storable)++#if __GLASGOW_HASKELL__ >= 708+import GHC.Exts (IsList(Item, fromList, toList))+#endif+#if MIN_VERSION_base(4,4,0)+import GHC.Generics (Generic)+# if __GLASGOW_HASKELL__ >= 706+import GHC.Generics (Generic1)+# endif+#endif+import GHC.Show (appPrec, appPrec1)++import Prelude ()+import Prelude.Compat hiding (Show(..))++import System.IO (Handle)++import Text.Printf (PrintfArg, PrintfType)+import Text.Read (Read(..), readListPrecDefault)+import qualified Text.Show as S (Show(..))+import Text.Show.Text.Utils (s, toString)++#include "inline.h"++-- | Conversion of values to @Text@. Because there are both strict and lazy @Text@+-- variants, the 'Show' class deliberately avoids using @Text@ in its functions.+-- Instead, 'showbPrec', 'showb', and 'showbList' all return 'Builder', an+-- efficient intermediate form that can be converted to either kind of @Text@.+-- +-- 'Builder' is a 'Monoid', so it is useful to use the 'mappend' (or '<>') function+-- to combine 'Builder's when creating 'Show' instances. As an example:+-- +-- @+-- import Text.Show.Text+-- +-- data Example = Example Int Int+-- instance Show Example where+-- showb (Example i1 i2) = showb i1 <> showbSpace <> showb i2+-- @+-- +-- If you do not want to create 'Show' instances manually, you can alternatively+-- use the "Text.Show.Text.TH" module to automatically generate default 'Show'+-- instances using Template Haskell, or the "Text.Show.Text.Generic" module to+-- quickly define 'Show' instances using 'genericShowbPrec'.+-- +-- /Since: 0.1/+class Show a where+ -- | Convert a value to a 'Builder' with the given predence.+ -- + -- /Since: 0.1/+ showbPrec :: Int -- ^ The operator precedence of the enclosing context (a number+ -- from @0@ to @11@). Function application has precedence @10@.+ -> a -- ^ The value to be converted to a 'String'.+ -> Builder+ + -- | A specialized variant of 'showbPrec' using precedence context zero.+ -- + -- /Since: 0.1/+ showb :: a -> Builder+ + -- | Allows for specialized display of lists. This is used, for example, when+ -- showing lists of 'Char's.+ -- + -- /Since: 0.1/+ showbList :: [a] -> Builder+ + showbPrec _ = showb+ + showb = showbPrec 0+ + showbList = showbListWith showb+#if __GLASGOW_HASKELL__ >= 708+ {-# MINIMAL showbPrec | showb #-}++deriving instance Typeable Show+#endif++-- | Lifting of the 'Show' class to unary type constructors.+-- +-- /Since: 0.5/+class Show1 f where+ -- | 'Builder' conversion for values of a type that has a unary type constructor.+ -- + -- /Since: 0.5/+ showbPrec1 :: Show a => Int -> f a -> Builder++#if __GLASGOW_HASKELL__ >= 708+deriving instance Typeable Show1+#endif++-- | Constructs a strict 'TS.Text' from a single value.+-- +-- /Since: 0.1/+show :: Show a => a -> TS.Text+show = toStrict . showLazy+{-# INLINE show #-}++-- | Constructs a lazy 'TL.Text' from a single value.+-- +-- /Since: 0.3/+showLazy :: Show a => a -> TL.Text+showLazy = toLazyText . showb+{-# INLINE showLazy #-}++-- | Constructs a strict 'TS.Text' from a single value with the given precedence.+-- +-- /Since: 0.3/+showPrec :: Show a => Int -> a -> TS.Text+showPrec p = toStrict . showPrecLazy p+{-# INLINE showPrec #-}++-- | Constructs a lazy 'TL.Text' from a single value with the given precedence.+-- +-- /Since: 0.3/+showPrecLazy :: Show a => Int -> a -> TL.Text+showPrecLazy p = toLazyText . showbPrec p+{-# INLINE showPrecLazy #-}++-- | Construct a strict 'TS.Text' from a list of values.+-- +-- /Since: 0.3.1/+showList :: Show a => [a] -> TS.Text+showList = toStrict . showListLazy+{-# INLINE showList #-}++-- | Construct a lazy 'TL.Text' from a list of values.+-- +-- /Since: 0.3.1/+showListLazy :: Show a => [a] -> TL.Text+showListLazy = toLazyText . showbList+{-# INLINE showListLazy #-}++-- | Surrounds 'Builder' output with parentheses if the 'Bool' parameter is 'True'.+-- +-- /Since: 0.1/+showbParen :: Bool -> Builder -> Builder+showbParen p builder | p = s '(' <> builder <> s ')'+ | otherwise = builder+{-# INLINE showbParen #-}++-- | Construct a 'Builder' containing a single space character.+-- +-- /Since: 0.5/+showbSpace :: Builder+showbSpace = s ' '+{-# INLINE showbSpace #-}++-- | Converts a list of values into a 'Builder' in which the values are surrounded+-- by square brackets and each value is separated by a comma. The function argument+-- controls how each element is shown.++-- @'showbListWith' 'showb'@ is the default implementation of 'showbList' save for+-- a few special cases (e.g., 'String').+-- +-- /Since: 0.7/+showbListWith :: (a -> Builder) -> [a] -> Builder+showbListWith _ [] = "[]"+showbListWith showbx (x:xs) = s '[' <> showbx x <> go xs -- "[..+ where+ go (y:ys) = s ',' <> showbx y <> go ys -- ..,..+ go [] = s ']' -- ..]"+{-# INLINE showbListWith #-}++-- | @'showbUnary' n p x@ produces the 'Builder' representation of a unary data+-- constructor with name @n@ and argument @x@, in precedence context @p@.+-- +-- /Since: 0.5/+showbUnary :: Show a => Builder -> Int -> a -> Builder+showbUnary nameB p x = showbParen (p > appPrec) $+ nameB <> showbSpace <> showbPrec appPrec1 x+{-# INLINE showbUnary #-}++-- | @'showbUnary1' n p x@ produces the 'Builder' representation of a unary data+-- constructor with name @n@ and argument @x@, in precedence context @p@.+-- +-- /Since: 0.5/+showbUnary1 :: (Show1 f, Show a) => Builder -> Int -> f a -> Builder+showbUnary1 nameB p x = showbParen (p > appPrec) $+ nameB <> showbSpace <> showbPrec1 appPrec1 x+{-# INLINE showbUnary1 #-}++-- | @'showbBinary1' n p x y@ produces the 'Builder' representation of a binary+-- data constructor with name @n@ and arguments @x@ and @y@, in precedence+-- context @p@.+-- +-- /Since: 0.5/+showbBinary1 :: (Show1 f, Show1 g, Show a) => Builder -> Int -> f a -> g a -> Builder+showbBinary1 nameB p x y = showbParen (p > appPrec) $ nameB+ <> showbSpace <> showbPrec1 appPrec1 x+ <> showbSpace <> showbPrec1 appPrec1 y+{-# INLINE showbBinary1 #-}++-- | Writes a value's strict 'TS.Text' representation to the standard output, followed+-- by a newline.+-- +-- /Since: 0.1/+print :: Show a => a -> IO ()+print = TS.putStrLn . show+{-# INLINE print #-}++-- | Writes a value's lazy 'TL.Text' representation to the standard output, followed+-- by a newline.+-- +-- /Since: 0.3/+printLazy :: Show a => a -> IO ()+printLazy = TL.putStrLn . showLazy+{-# INLINE printLazy #-}++-- | Writes a value's strict 'TS.Text' representation to a file handle, followed+-- by a newline.+-- +-- /Since: 0.3/+hPrint :: Show a => Handle -> a -> IO ()+hPrint h = TS.hPutStrLn h . show+{-# INLINE hPrint #-}++-- | Writes a value's lazy 'TL.Text' representation to a file handle, followed+-- by a newline.+-- +-- /Since: 0.3/+hPrintLazy :: Show a => Handle -> a -> IO ()+hPrintLazy h = TL.hPutStrLn h . showLazy+{-# INLINE hPrintLazy #-}++-- | The @Text@ 'T.Show' instance for 'FromStringShow' is based on its @String@+-- 'S.Show' instance. That is,+-- +-- @+-- showbPrec p ('FromStringShow' x) = 'fromString' (showsPrec p x "")+-- @+-- +-- /Since: 0.5/+newtype FromStringShow a = FromStringShow { fromStringShow :: a }+ deriving ( Bits+ , Bounded+ , Data+ , Enum+ , Eq+#if MIN_VERSION_base(4,7,0)+ , FiniteBits+#endif+ , Floating+ , Foldable+ , Fractional+ , Functor+#if MIN_VERSION_base(4,4,0)+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ , Integral+ , IsString+ , Ix+ , Monoid+ , Num+ , Ord+ , PrintfArg+ , PrintfType+ , Real+ , RealFloat+ , RealFrac+ , Semigroup+ , Storable+ , Traversable+ , Typeable+ )++instance Applicative FromStringShow where+ pure = FromStringShow+ INLINE_INST_FUN(pure)+ + FromStringShow f <*> FromStringShow x = FromStringShow $ f x+ INLINE_INST_FUN((<*>))++#if __GLASGOW_HASKELL__ >= 708+instance IsList a => IsList (FromStringShow a) where+ type Item (FromStringShow a) = Item a+ fromList = FromStringShow . fromList+ {-# INLINE fromList #-}+ toList = toList . fromStringShow+ {-# INLINE toList #-}+#endif++instance Monad FromStringShow where+ return = FromStringShow+ INLINE_INST_FUN(return)+ + FromStringShow a >>= f = f a+ INLINE_INST_FUN((>>=))++instance MonadFix FromStringShow where+ mfix f = FromStringShow $ let FromStringShow a = f a in a+ INLINE_INST_FUN(mfix)++#if MIN_VERSION_base(4,4,0)+instance MonadZip FromStringShow where+ mzip (FromStringShow a) (FromStringShow b) = FromStringShow (a, b)+ INLINE_INST_FUN(mzip)+ + mzipWith f (FromStringShow a) (FromStringShow b) = FromStringShow $ f a b+ INLINE_INST_FUN(mzipWith)+ + munzip (FromStringShow (a, b)) = (FromStringShow a, FromStringShow b)+ INLINE_INST_FUN(munzip)+#endif++instance Read a => Read (FromStringShow a) where+ readPrec = FromStringShow <$> readPrec+ INLINE_INST_FUN(readPrec)+ + readListPrec = readListPrecDefault+ INLINE_INST_FUN(readListPrec)++instance S.Show a => Show (FromStringShow a) where+ showbPrec p (FromStringShow x) = fromString $ S.showsPrec p x ""+ INLINE_INST_FUN(showbPrec)++instance S.Show a => S.Show (FromStringShow a) where+ showsPrec p (FromStringShow x) = S.showsPrec p x+ INLINE_INST_FUN(showsPrec)++-- | The @String@ 'S.Show' instance for 'FromTextShow' is based on its @Text@+-- 'T.Show' instance. That is,+-- +-- @+-- showsPrec p ('FromTextShow' x) str = 'toString' (showbPrec p x) ++ str+-- @+-- +-- /Since: 0.6/+newtype FromTextShow a = FromTextShow { fromTextShow :: a }+ deriving ( Bits+ , Bounded+ , Data+ , Enum+ , Eq+#if MIN_VERSION_base(4,7,0)+ , FiniteBits+#endif+ , Floating+ , Foldable+ , Fractional+ , Functor+#if MIN_VERSION_base(4,4,0)+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ , Integral+ , IsString+ , Ix+ , Monoid+ , Num+ , Ord+ , PrintfArg+ , PrintfType+ , Real+ , RealFloat+ , RealFrac+ , Semigroup+ , Show+ , Storable+ , Traversable+ , Typeable+ )++instance Applicative FromTextShow where+ pure = FromTextShow+ INLINE_INST_FUN(pure)+ + FromTextShow f <*> FromTextShow x = FromTextShow $ f x+ INLINE_INST_FUN((<*>))++#if __GLASGOW_HASKELL__ >= 708+instance IsList a => IsList (FromTextShow a) where+ type Item (FromTextShow a) = Item a+ fromList = FromTextShow . fromList+ {-# INLINE fromList #-}+ toList = toList . fromTextShow+ {-# INLINE toList #-}+#endif++instance Monad FromTextShow where+ return = FromTextShow+ INLINE_INST_FUN(return)+ + FromTextShow a >>= f = f a+ INLINE_INST_FUN((>>=))++instance MonadFix FromTextShow where+ mfix f = FromTextShow $ let FromTextShow a = f a in a+ INLINE_INST_FUN(mfix)++#if MIN_VERSION_base(4,4,0)+instance MonadZip FromTextShow where+ mzip (FromTextShow a) (FromTextShow b) = FromTextShow (a, b)+ INLINE_INST_FUN(mzip)+ + mzipWith f (FromTextShow a) (FromTextShow b) = FromTextShow $ f a b+ INLINE_INST_FUN(mzipWith)+ + munzip (FromTextShow (a, b)) = (FromTextShow a, FromTextShow b)+ INLINE_INST_FUN(munzip)+#endif++instance Read a => Read (FromTextShow a) where+ readPrec = FromTextShow <$> readPrec+ INLINE_INST_FUN(readPrec)+ + readListPrec = readListPrecDefault+ INLINE_INST_FUN(readListPrec)++instance Show a => S.Show (FromTextShow a) where+ showsPrec p (FromTextShow x) str = toString (showbPrec p x) ++ str+ INLINE_INST_FUN(showsPrec)++instance Show1 FromTextShow where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
− src/Text/Show/Text/Control.hs
@@ -1,16 +0,0 @@-{-| -Module: Text.Show.Text.Control -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @Control@ modules. --} -module Text.Show.Text.Control () where - -import Text.Show.Text.Control.Applicative () -import Text.Show.Text.Control.Concurrent () -import Text.Show.Text.Control.Exception () -import Text.Show.Text.Control.Monad.ST ()
src/Text/Show/Text/Control/Applicative.hs view
@@ -1,57 +1,57 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Control.Applicative -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'ZipList'. - -/Since: 0.3/ --} -module Text.Show.Text.Control.Applicative (showbConstPrec, showbZipListPrec) where - -import Control.Applicative (Const(..), ZipList) - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1), showbUnary) -import Text.Show.Text.Data.List () -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) - -#include "inline.h" - --- | Convert a 'Const' value to a 'Builder' with the given precedence. --- --- /Since: 0.7/ -showbConstPrec :: Show a => Int -> Const a b -> Builder -showbConstPrec p (Const x) = showbUnary "Const" p x -{-# INLINE showbConstPrec #-} - --- | Convert a 'ZipList' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbZipListPrec :: Show a => Int -> ZipList a -> Builder -showbZipListPrec = showbPrec -{-# INLINE showbZipListPrec #-} - -instance Show a => Show (Const a b) where - showbPrec = showbConstPrec - INLINE_INST_FUN(showbPrec) - -instance Show a => Show1 (Const a) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -$(deriveShowPragmas defaultInlineShowbPrec ''ZipList) - -instance Show1 ZipList where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Control.Applicative+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'ZipList'.++/Since: 0.3/+-}+module Text.Show.Text.Control.Applicative (showbConstPrec, showbZipListPrec) where++import Control.Applicative (Const(..), ZipList)++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1), showbUnary)+import Text.Show.Text.Data.List ()+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++#include "inline.h"++-- | Convert a 'Const' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.7/+showbConstPrec :: Show a => Int -> Const a b -> Builder+showbConstPrec p (Const x) = showbUnary "Const" p x+{-# INLINE showbConstPrec #-}++-- | Convert a 'ZipList' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbZipListPrec :: Show a => Int -> ZipList a -> Builder+showbZipListPrec = showbPrec+{-# INLINE showbZipListPrec #-}++instance Show a => Show (Const a b) where+ showbPrec = showbConstPrec+ INLINE_INST_FUN(showbPrec)++instance Show a => Show1 (Const a) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++$(deriveShowPragmas defaultInlineShowbPrec ''ZipList)++instance Show1 ZipList where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Control/Concurrent.hs view
@@ -1,59 +1,59 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Control.Concurrent -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for concurrency-related data types. - -/Since: 0.3/ --} -module Text.Show.Text.Control.Concurrent ( - showbThreadIdPrec - , showbThreadStatusPrec - , showbBlockReason - ) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.Conc (BlockReason, ThreadId, ThreadStatus) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..)) -import Text.Show.Text.TH.Internal (deriveShow) - -#include "inline.h" - --- | Convert a 'ThreadId' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbThreadIdPrec :: Int -> ThreadId -> Builder -showbThreadIdPrec p = showbPrec p . FromStringShow -{-# INLINE showbThreadIdPrec #-} - --- | Convert a 'ThreadStatus' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbThreadStatusPrec :: Int -> ThreadStatus -> Builder -showbThreadStatusPrec = showbPrec -{-# INLINE showbThreadStatusPrec #-} - --- | Convert a 'BlockReason' to a 'Builder'. --- --- /Since: 0.3/ -showbBlockReason :: BlockReason -> Builder -showbBlockReason = showb -{-# INLINE showbBlockReason #-} - -instance Show ThreadId where - showbPrec = showbThreadIdPrec - INLINE_INST_FUN(showbPrec) - -$(deriveShow ''ThreadStatus) -$(deriveShow ''BlockReason) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Control.Concurrent+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for concurrency-related data types.++/Since: 0.3/+-}+module Text.Show.Text.Control.Concurrent (+ showbThreadIdPrec+ , showbThreadStatusPrec+ , showbBlockReason+ ) where++import Data.Text.Lazy.Builder (Builder)++import GHC.Conc (BlockReason, ThreadId, ThreadStatus)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..))+import Text.Show.Text.TH.Internal (deriveShow)++#include "inline.h"++-- | Convert a 'ThreadId' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbThreadIdPrec :: Int -> ThreadId -> Builder+showbThreadIdPrec p = showbPrec p . FromStringShow+{-# INLINE showbThreadIdPrec #-}++-- | Convert a 'ThreadStatus' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbThreadStatusPrec :: Int -> ThreadStatus -> Builder+showbThreadStatusPrec = showbPrec+{-# INLINE showbThreadStatusPrec #-}++-- | Convert a 'BlockReason' to a 'Builder'.+-- +-- /Since: 0.3/+showbBlockReason :: BlockReason -> Builder+showbBlockReason = showb+{-# INLINE showbBlockReason #-}++instance Show ThreadId where+ showbPrec = showbThreadIdPrec+ INLINE_INST_FUN(showbPrec)++$(deriveShow ''ThreadStatus)+$(deriveShow ''BlockReason)
src/Text/Show/Text/Control/Exception.hs view
@@ -1,301 +1,299 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Control.Exception -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Exception's. - -/Since: 0.3/ --} -module Text.Show.Text.Control.Exception ( - showbSomeExceptionPrec - , showbIOException - , showbArithException - , showbArrayException - , showbAssertionFailed -#if MIN_VERSION_base(4,7,0) - , showbSomeAsyncException -#endif - , showbAsyncException - , showbNonTermination - , showbNestedAtomically - , showbBlockedIndefinitelyOnMVar - , showbBlockedIndefinitelyOnSTM -#if MIN_VERSION_base(4,8,0) - , showbAllocationLimitExceeded -#endif - , showbDeadlock - , showbNoMethodError - , showbPatternMatchFail - , showbRecConError - , showbRecSelError - , showbRecUpdError - , showbErrorCall - , showbMaskingState - ) where - -import Control.Exception.Base - -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -#endif -import Data.Text.Lazy.Builder (Builder, fromString) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..)) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb) -import Text.Show.Text.Utils ((<>)) - -#include "inline.h" - --- | Convert a 'SomeException' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbSomeExceptionPrec :: Int -> SomeException -> Builder -showbSomeExceptionPrec p (SomeException e) = showbPrec p $ FromStringShow e -{-# INLINE showbSomeExceptionPrec #-} - --- | Convert an 'IOException' to a 'Builder'. --- --- /Since: 0.3/ -showbIOException :: IOException -> Builder -showbIOException = showb . FromStringShow -{-# INLINE showbIOException #-} - --- | Convert an 'ArithException' to a 'Builder'. --- --- /Since: 0.3/ -showbArithException :: ArithException -> Builder -showbArithException Overflow = "arithmetic overflow" -showbArithException Underflow = "arithmetic underflow" -showbArithException LossOfPrecision = "loss of precision" -showbArithException DivideByZero = "divide by zero" -showbArithException Denormal = "denormal" -#if MIN_VERSION_base(4,6,0) -showbArithException RatioZeroDenominator = "Ratio has zero denominator" -#endif - --- | Convert an 'ArrayException' to a 'Builder'. --- --- /Since: 0.3/ -showbArrayException :: ArrayException -> Builder -showbArrayException (IndexOutOfBounds s) - = "array index out of range" - <> (if not $ null s then ": " <> fromString s - else mempty) -showbArrayException (UndefinedElement s) - = "undefined array element" - <> (if not $ null s then ": " <> fromString s - else mempty) -{-# INLINE showbArrayException #-} - --- | Convert an 'AssertionFailed' exception to a 'Builder'. --- --- /Since: 0.3/ -showbAssertionFailed :: AssertionFailed -> Builder -showbAssertionFailed (AssertionFailed err) = fromString err -{-# INLINE showbAssertionFailed #-} - -#if MIN_VERSION_base(4,7,0) --- | Convert a 'SomeAsyncException' value to a 'Builder'. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.3/ -showbSomeAsyncException :: SomeAsyncException -> Builder -showbSomeAsyncException (SomeAsyncException e) = showb $ FromStringShow e -{-# INLINE showbSomeAsyncException #-} -#endif - --- | Convert an 'AsyncException' to a 'Builder'. --- --- /Since: 0.3/ -showbAsyncException :: AsyncException -> Builder -showbAsyncException StackOverflow = "stack overflow" -showbAsyncException HeapOverflow = "heap overflow" -showbAsyncException ThreadKilled = "thread killed" -showbAsyncException UserInterrupt = "user interrupt" -{-# INLINE showbAsyncException #-} - --- | Convert a 'NonTermination' exception to a 'Builder'. --- --- /Since: 0.3/ -showbNonTermination :: NonTermination -> Builder -showbNonTermination NonTermination = "<<loop>>" -{-# INLINE showbNonTermination #-} - --- | Convert a 'NestedAtomically' exception to a 'Builder'. --- --- /Since: 0.3/ -showbNestedAtomically :: NestedAtomically -> Builder -showbNestedAtomically NestedAtomically = "Control.Concurrent.STM.atomically was nested" -{-# INLINE showbNestedAtomically #-} - --- | Convert a 'BlockedIndefinitelyOnMVar' exception to a 'Builder'. --- --- /Since: 0.3/ -showbBlockedIndefinitelyOnMVar :: BlockedIndefinitelyOnMVar -> Builder -showbBlockedIndefinitelyOnMVar BlockedIndefinitelyOnMVar = "thread blocked indefinitely in an MVar operation" -{-# INLINE showbBlockedIndefinitelyOnMVar #-} - --- | Convert a 'BlockedIndefinitelyOnSTM' exception to a 'Builder'. --- --- /Since: 0.3/ -showbBlockedIndefinitelyOnSTM :: BlockedIndefinitelyOnSTM -> Builder -showbBlockedIndefinitelyOnSTM BlockedIndefinitelyOnSTM = "thread blocked indefinitely in an STM transaction" -{-# INLINE showbBlockedIndefinitelyOnSTM #-} - -#if MIN_VERSION_base(4,8,0) --- | Convert an 'AllocationLimitExceeded' exception to a 'Builder'. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbAllocationLimitExceeded :: AllocationLimitExceeded -> Builder -showbAllocationLimitExceeded AllocationLimitExceeded = "allocation limit exceeded" -{-# INLINE showbAllocationLimitExceeded #-} -#endif - --- | Convert a 'Deadlock' exception to a 'Builder'. --- --- /Since: 0.3/ -showbDeadlock :: Deadlock -> Builder -showbDeadlock Deadlock = "<<deadlock>>" -{-# INLINE showbDeadlock #-} - --- | Convert a 'NoMethodError' to a 'Builder'. --- --- /Since: 0.3/ -showbNoMethodError :: NoMethodError -> Builder -showbNoMethodError (NoMethodError err) = fromString err -{-# INLINE showbNoMethodError #-} - --- | Convert a 'PatternMatchFail' to a 'Builder'. --- --- /Since: 0.3/ -showbPatternMatchFail :: PatternMatchFail -> Builder -showbPatternMatchFail (PatternMatchFail err) = fromString err -{-# INLINE showbPatternMatchFail #-} - --- | Convert a 'RecConError' to a 'Builder'. --- --- /Since: 0.3/ -showbRecConError :: RecConError -> Builder -showbRecConError (RecConError err) = fromString err -{-# INLINE showbRecConError #-} - --- | Convert a 'RecSelError' to a 'Builder'. --- --- /Since: 0.3/ -showbRecSelError :: RecSelError -> Builder -showbRecSelError (RecSelError err) = fromString err -{-# INLINE showbRecSelError #-} - --- | Convert a 'RecUpdError' to a 'Builder'. --- --- /Since: 0.3/ -showbRecUpdError :: RecUpdError -> Builder -showbRecUpdError (RecUpdError err) = fromString err -{-# INLINE showbRecUpdError #-} - --- | Convert an 'ErrorCall' to a 'Builder'. --- --- /Since: 0.3/ -showbErrorCall :: ErrorCall -> Builder -showbErrorCall (ErrorCall err) = fromString err -{-# INLINE showbErrorCall #-} - --- | Convert a 'MaskingState' to a 'Builder'. --- --- /Since: 0.4/ -showbMaskingState :: MaskingState -> Builder -showbMaskingState = showb -{-# INLINE showbMaskingState #-} - -instance Show SomeException where - showbPrec = showbSomeExceptionPrec - INLINE_INST_FUN(showbPrec) - -instance Show IOException where - showb = showbIOException - INLINE_INST_FUN(showb) - -instance Show ArithException where - showb = showbArithException - INLINE_INST_FUN(showb) - -instance Show ArrayException where - showb = showbArrayException - INLINE_INST_FUN(showb) - -instance Show AssertionFailed where - showb = showbAssertionFailed - INLINE_INST_FUN(showb) - -#if MIN_VERSION_base(4,7,0) -instance Show SomeAsyncException where - showb = showbSomeAsyncException - {-# INLINE showb #-} -#endif - -instance Show AsyncException where - showb = showbAsyncException - INLINE_INST_FUN(showb) - -instance Show NonTermination where - showb = showbNonTermination - INLINE_INST_FUN(showb) - -instance Show NestedAtomically where - showb = showbNestedAtomically - INLINE_INST_FUN(showb) - -instance Show BlockedIndefinitelyOnMVar where - showb = showbBlockedIndefinitelyOnMVar - INLINE_INST_FUN(showb) - -instance Show BlockedIndefinitelyOnSTM where - showb = showbBlockedIndefinitelyOnSTM - INLINE_INST_FUN(showb) - -#if MIN_VERSION_base(4,8,0) -instance Show AllocationLimitExceeded where - showb = showbAllocationLimitExceeded - {-# INLINE showb #-} -#endif - -instance Show Deadlock where - showb = showbDeadlock - INLINE_INST_FUN(showb) - -instance Show NoMethodError where - showb = showbNoMethodError - INLINE_INST_FUN(showb) - -instance Show PatternMatchFail where - showb = showbPatternMatchFail - INLINE_INST_FUN(showb) - -instance Show RecConError where - showb = showbRecConError - INLINE_INST_FUN(showb) - -instance Show RecSelError where - showb = showbRecSelError - INLINE_INST_FUN(showb) - -instance Show RecUpdError where - showb = showbRecUpdError - INLINE_INST_FUN(showb) - -instance Show ErrorCall where - showb = showbErrorCall - INLINE_INST_FUN(showb) - -$(deriveShowPragmas defaultInlineShowb ''MaskingState) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Control.Exception+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Exception's.++/Since: 0.3/+-}+module Text.Show.Text.Control.Exception (+ showbSomeExceptionPrec+ , showbIOException+ , showbArithException+ , showbArrayException+ , showbAssertionFailed+#if MIN_VERSION_base(4,7,0)+ , showbSomeAsyncException+#endif+ , showbAsyncException+ , showbNonTermination+ , showbNestedAtomically+ , showbBlockedIndefinitelyOnMVar+ , showbBlockedIndefinitelyOnSTM+#if MIN_VERSION_base(4,8,0)+ , showbAllocationLimitExceeded+#endif+ , showbDeadlock+ , showbNoMethodError+ , showbPatternMatchFail+ , showbRecConError+ , showbRecSelError+ , showbRecUpdError+ , showbErrorCall+ , showbMaskingState+ ) where++import Control.Exception.Base++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder, fromString)++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..))+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb)++#include "inline.h"++-- | Convert a 'SomeException' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbSomeExceptionPrec :: Int -> SomeException -> Builder+showbSomeExceptionPrec p (SomeException e) = showbPrec p $ FromStringShow e+{-# INLINE showbSomeExceptionPrec #-}++-- | Convert an 'IOException' to a 'Builder'.+-- +-- /Since: 0.3/+showbIOException :: IOException -> Builder+showbIOException = showb . FromStringShow+{-# INLINE showbIOException #-}++-- | Convert an 'ArithException' to a 'Builder'.+-- +-- /Since: 0.3/+showbArithException :: ArithException -> Builder+showbArithException Overflow = "arithmetic overflow"+showbArithException Underflow = "arithmetic underflow"+showbArithException LossOfPrecision = "loss of precision"+showbArithException DivideByZero = "divide by zero"+showbArithException Denormal = "denormal"+#if MIN_VERSION_base(4,6,0)+showbArithException RatioZeroDenominator = "Ratio has zero denominator"+#endif++-- | Convert an 'ArrayException' to a 'Builder'.+-- +-- /Since: 0.3/+showbArrayException :: ArrayException -> Builder+showbArrayException (IndexOutOfBounds s)+ = "array index out of range"+ <> (if not $ null s then ": " <> fromString s+ else mempty)+showbArrayException (UndefinedElement s)+ = "undefined array element"+ <> (if not $ null s then ": " <> fromString s+ else mempty)+{-# INLINE showbArrayException #-}++-- | Convert an 'AssertionFailed' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbAssertionFailed :: AssertionFailed -> Builder+showbAssertionFailed (AssertionFailed err) = fromString err+{-# INLINE showbAssertionFailed #-}++#if MIN_VERSION_base(4,7,0)+-- | Convert a 'SomeAsyncException' value to a 'Builder'.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.3/+showbSomeAsyncException :: SomeAsyncException -> Builder+showbSomeAsyncException (SomeAsyncException e) = showb $ FromStringShow e+{-# INLINE showbSomeAsyncException #-}+#endif++-- | Convert an 'AsyncException' to a 'Builder'.+-- +-- /Since: 0.3/+showbAsyncException :: AsyncException -> Builder+showbAsyncException StackOverflow = "stack overflow"+showbAsyncException HeapOverflow = "heap overflow"+showbAsyncException ThreadKilled = "thread killed"+showbAsyncException UserInterrupt = "user interrupt"+{-# INLINE showbAsyncException #-}++-- | Convert a 'NonTermination' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbNonTermination :: NonTermination -> Builder+showbNonTermination NonTermination = "<<loop>>"+{-# INLINE showbNonTermination #-}++-- | Convert a 'NestedAtomically' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbNestedAtomically :: NestedAtomically -> Builder+showbNestedAtomically NestedAtomically = "Control.Concurrent.STM.atomically was nested"+{-# INLINE showbNestedAtomically #-}++-- | Convert a 'BlockedIndefinitelyOnMVar' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbBlockedIndefinitelyOnMVar :: BlockedIndefinitelyOnMVar -> Builder+showbBlockedIndefinitelyOnMVar BlockedIndefinitelyOnMVar = "thread blocked indefinitely in an MVar operation"+{-# INLINE showbBlockedIndefinitelyOnMVar #-}++-- | Convert a 'BlockedIndefinitelyOnSTM' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbBlockedIndefinitelyOnSTM :: BlockedIndefinitelyOnSTM -> Builder+showbBlockedIndefinitelyOnSTM BlockedIndefinitelyOnSTM = "thread blocked indefinitely in an STM transaction"+{-# INLINE showbBlockedIndefinitelyOnSTM #-}++#if MIN_VERSION_base(4,8,0)+-- | Convert an 'AllocationLimitExceeded' exception to a 'Builder'.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbAllocationLimitExceeded :: AllocationLimitExceeded -> Builder+showbAllocationLimitExceeded AllocationLimitExceeded = "allocation limit exceeded"+{-# INLINE showbAllocationLimitExceeded #-}+#endif++-- | Convert a 'Deadlock' exception to a 'Builder'.+-- +-- /Since: 0.3/+showbDeadlock :: Deadlock -> Builder+showbDeadlock Deadlock = "<<deadlock>>"+{-# INLINE showbDeadlock #-}++-- | Convert a 'NoMethodError' to a 'Builder'.+-- +-- /Since: 0.3/+showbNoMethodError :: NoMethodError -> Builder+showbNoMethodError (NoMethodError err) = fromString err+{-# INLINE showbNoMethodError #-}++-- | Convert a 'PatternMatchFail' to a 'Builder'.+-- +-- /Since: 0.3/+showbPatternMatchFail :: PatternMatchFail -> Builder+showbPatternMatchFail (PatternMatchFail err) = fromString err+{-# INLINE showbPatternMatchFail #-}++-- | Convert a 'RecConError' to a 'Builder'.+-- +-- /Since: 0.3/+showbRecConError :: RecConError -> Builder+showbRecConError (RecConError err) = fromString err+{-# INLINE showbRecConError #-}++-- | Convert a 'RecSelError' to a 'Builder'.+-- +-- /Since: 0.3/+showbRecSelError :: RecSelError -> Builder+showbRecSelError (RecSelError err) = fromString err+{-# INLINE showbRecSelError #-}++-- | Convert a 'RecUpdError' to a 'Builder'.+-- +-- /Since: 0.3/+showbRecUpdError :: RecUpdError -> Builder+showbRecUpdError (RecUpdError err) = fromString err+{-# INLINE showbRecUpdError #-}++-- | Convert an 'ErrorCall' to a 'Builder'.+-- +-- /Since: 0.3/+showbErrorCall :: ErrorCall -> Builder+showbErrorCall (ErrorCall err) = fromString err+{-# INLINE showbErrorCall #-}++-- | Convert a 'MaskingState' to a 'Builder'.+-- +-- /Since: 0.4/+showbMaskingState :: MaskingState -> Builder+showbMaskingState = showb+{-# INLINE showbMaskingState #-}++instance Show SomeException where+ showbPrec = showbSomeExceptionPrec+ INLINE_INST_FUN(showbPrec)++instance Show IOException where+ showb = showbIOException+ INLINE_INST_FUN(showb)++instance Show ArithException where+ showb = showbArithException+ INLINE_INST_FUN(showb)++instance Show ArrayException where+ showb = showbArrayException+ INLINE_INST_FUN(showb)++instance Show AssertionFailed where+ showb = showbAssertionFailed+ INLINE_INST_FUN(showb)++#if MIN_VERSION_base(4,7,0)+instance Show SomeAsyncException where+ showb = showbSomeAsyncException+ {-# INLINE showb #-}+#endif++instance Show AsyncException where+ showb = showbAsyncException+ INLINE_INST_FUN(showb)++instance Show NonTermination where+ showb = showbNonTermination+ INLINE_INST_FUN(showb)++instance Show NestedAtomically where+ showb = showbNestedAtomically+ INLINE_INST_FUN(showb)++instance Show BlockedIndefinitelyOnMVar where+ showb = showbBlockedIndefinitelyOnMVar+ INLINE_INST_FUN(showb)++instance Show BlockedIndefinitelyOnSTM where+ showb = showbBlockedIndefinitelyOnSTM+ INLINE_INST_FUN(showb)++#if MIN_VERSION_base(4,8,0)+instance Show AllocationLimitExceeded where+ showb = showbAllocationLimitExceeded+ {-# INLINE showb #-}+#endif++instance Show Deadlock where+ showb = showbDeadlock+ INLINE_INST_FUN(showb)++instance Show NoMethodError where+ showb = showbNoMethodError+ INLINE_INST_FUN(showb)++instance Show PatternMatchFail where+ showb = showbPatternMatchFail+ INLINE_INST_FUN(showb)++instance Show RecConError where+ showb = showbRecConError+ INLINE_INST_FUN(showb)++instance Show RecSelError where+ showb = showbRecSelError+ INLINE_INST_FUN(showb)++instance Show RecUpdError where+ showb = showbRecUpdError+ INLINE_INST_FUN(showb)++instance Show ErrorCall where+ showb = showbErrorCall+ INLINE_INST_FUN(showb)++$(deriveShowPragmas defaultInlineShowb ''MaskingState)
src/Text/Show/Text/Control/Monad/ST.hs view
@@ -1,38 +1,38 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Control.Monad.ST -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for strict 'ST' values. - -/Since: 0.3/ --} -module Text.Show.Text.Control.Monad.ST (showbST) where - -import Control.Monad.ST (ST) -import Data.Text.Lazy.Builder (Builder) -import Prelude hiding (Show) -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) - -#include "inline.h" - --- | Convert a strict 'ST' value to a 'Builder'. --- --- /Since: 0.3/ -showbST :: ST s a -> Builder -showbST _ = "<<ST action>>" -{-# INLINE showbST #-} - -instance Show (ST s a) where - showb = showbST - INLINE_INST_FUN(showb) - -instance Show1 (ST s) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Control.Monad.ST+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for strict 'ST' values.++/Since: 0.3/+-}+module Text.Show.Text.Control.Monad.ST (showbST) where++import Control.Monad.ST (ST)+import Data.Text.Lazy.Builder (Builder)+import Prelude ()+import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))++#include "inline.h"++-- | Convert a strict 'ST' value to a 'Builder'.+-- +-- /Since: 0.3/+showbST :: ST s a -> Builder+showbST _ = "<<ST action>>"+{-# INLINE showbST #-}++instance Show (ST s a) where+ showb = showbST+ INLINE_INST_FUN(showb)++instance Show1 (ST s) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
− src/Text/Show/Text/Data.hs
@@ -1,43 +0,0 @@-{-# LANGUAGE CPP #-} -{-| -Module: Text.Show.Text.Data -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @Data@ modules. --} -module Text.Show.Text.Data () where - -import Text.Show.Text.Data.Array () -import Text.Show.Text.Data.Bool () -import Text.Show.Text.Data.ByteString () -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.Complex () -import Text.Show.Text.Data.Data () -import Text.Show.Text.Data.Dynamic () -import Text.Show.Text.Data.Either () -import Text.Show.Text.Data.Fixed () -import Text.Show.Text.Data.Floating () -import Text.Show.Text.Data.Functor.Identity () -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Maybe () -import Text.Show.Text.Data.Monoid () -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) -import Text.Show.Text.Data.OldTypeable () -#endif -import Text.Show.Text.Data.Ord () -import Text.Show.Text.Data.Proxy () -import Text.Show.Text.Data.Ratio () -import Text.Show.Text.Data.Text () -import Text.Show.Text.Data.Tuple () -#if MIN_VERSION_base(4,7,0) -import Text.Show.Text.Data.Type.Coercion () -import Text.Show.Text.Data.Type.Equality () -#endif -import Text.Show.Text.Data.Typeable () -import Text.Show.Text.Data.Version () -import Text.Show.Text.Data.Void ()
src/Text/Show/Text/Data/Array.hs view
@@ -1,80 +1,81 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Array -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Array' values. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Array ( - showbArrayPrec - , showbUArrayPrec - , showbIArrayPrec - ) where - -import qualified Data.Array as Array (assocs, bounds) -import Data.Array (Array) -import qualified Data.Array.Base as IArray (assocs, bounds) -import Data.Array.Base (IArray) -import Data.Array.Unboxed (UArray) -import Data.Ix (Ix) -import Data.Text.Lazy.Builder (Builder) - -import GHC.Show (appPrec) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace) -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Tuple () -import Text.Show.Text.Utils ((<>)) - -#include "inline.h" - --- | Convert an 'Array' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbArrayPrec :: (Show i, Show e, Ix i) => Int -> Array i e -> Builder -showbArrayPrec p a = showbParen (p > appPrec) $ - "array " - <> showb (Array.bounds a) - <> showbSpace - <> showb (Array.assocs a) -{-# INLINE showbArrayPrec #-} - --- | Convert a 'UArray' value to a 'Builder' with the given precedence. --- --- /Since: 0.7/ -showbUArrayPrec :: (IArray UArray e, Ix i, Show i, Show e) => Int -> UArray i e -> Builder -showbUArrayPrec = showbIArrayPrec -{-# INLINE showbUArrayPrec #-} - -{-# SPECIALIZE - showbIArrayPrec :: (IArray UArray e, Ix i, Show i, Show e) => - Int -> UArray i e -> Builder - #-} --- | Convert an 'IArray' instance to a 'Builder' with the given precedence. --- --- /Since: 0.7/ -showbIArrayPrec :: (IArray a e, Ix i, Show i, Show e) => Int -> a i e -> Builder -showbIArrayPrec p a = showbParen (p > 9) $ - "array " - <> showb (IArray.bounds a) - <> showbSpace - <> showb (IArray.assocs a) - -instance (Show i, Show e, Ix i) => Show (Array i e) where - showbPrec = showbArrayPrec - INLINE_INST_FUN(showbPrec) - -instance (IArray UArray e, Ix i, Show i, Show e) => Show (UArray i e) where - showbPrec = showbUArrayPrec - INLINE_INST_FUN(showbPrec) +{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Array+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Array' values.++/Since: 0.3/+-}+module Text.Show.Text.Data.Array (+ showbArrayPrec+ , showbUArrayPrec+ , showbIArrayPrec+ ) where++import qualified Data.Array as Array (assocs, bounds)+import Data.Array (Array)+import qualified Data.Array.Base as IArray (assocs, bounds)+import Data.Array.Base (IArray)+import Data.Array.Unboxed (UArray)+import Data.Ix (Ix)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import GHC.Show (appPrec)++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace)+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Tuple ()++#include "inline.h"++-- | Convert an 'Array' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbArrayPrec :: (Show i, Show e, Ix i) => Int -> Array i e -> Builder+showbArrayPrec p a = showbParen (p > appPrec) $+ "array "+ <> showb (Array.bounds a)+ <> showbSpace+ <> showb (Array.assocs a)+{-# INLINE showbArrayPrec #-}++-- | Convert a 'UArray' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.7/+showbUArrayPrec :: (IArray UArray e, Ix i, Show i, Show e) => Int -> UArray i e -> Builder+showbUArrayPrec = showbIArrayPrec+{-# INLINE showbUArrayPrec #-}++{-# SPECIALIZE+ showbIArrayPrec :: (IArray UArray e, Ix i, Show i, Show e) =>+ Int -> UArray i e -> Builder+ #-}+-- | Convert an 'IArray' instance to a 'Builder' with the given precedence.+-- +-- /Since: 0.7/+showbIArrayPrec :: (IArray a e, Ix i, Show i, Show e) => Int -> a i e -> Builder+showbIArrayPrec p a = showbParen (p > 9) $+ "array "+ <> showb (IArray.bounds a)+ <> showbSpace+ <> showb (IArray.assocs a)++instance (Show i, Show e, Ix i) => Show (Array i e) where+ showbPrec = showbArrayPrec+ INLINE_INST_FUN(showbPrec)++instance (IArray UArray e, Ix i, Show i, Show e) => Show (UArray i e) where+ showbPrec = showbUArrayPrec+ INLINE_INST_FUN(showbPrec)
src/Text/Show/Text/Data/Bool.hs view
@@ -1,29 +1,29 @@-{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Bool -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Bool' values. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Bool (showbBool) where - -import Data.Text.Lazy.Builder (Builder) - -import Text.Show.Text.Classes (showb) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb) - --- | Convert a 'Bool' to a 'Builder'. --- --- /Since: 0.3/ -showbBool :: Bool -> Builder -showbBool = showb -{-# INLINE showbBool #-} - +{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Bool+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Bool' values.++/Since: 0.3/+-}+module Text.Show.Text.Data.Bool (showbBool) where++import Data.Text.Lazy.Builder (Builder)++import Text.Show.Text.Classes (showb)+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb)++-- | Convert a 'Bool' to a 'Builder'.+-- +-- /Since: 0.3/+showbBool :: Bool -> Builder+showbBool = showb+{-# INLINE showbBool #-}+ $(deriveShowPragmas defaultInlineShowb ''Bool)
src/Text/Show/Text/Data/ByteString.hs view
@@ -1,92 +1,92 @@-{-# LANGUAGE CPP #-} -#if !(MIN_VERSION_bytestring(0,10,0)) -{-# LANGUAGE TemplateHaskell #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.ByteString -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @bytestring@ library. - -/Since: 0.3/ --} -module Text.Show.Text.Data.ByteString ( - showbByteStringStrict - , showbByteStringLazy - , showbByteStringLazyPrec - , showbShortByteString - ) where - -import qualified Data.ByteString as BS -import qualified Data.ByteString.Lazy as BL -import Data.ByteString.Short (ShortByteString) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show(show)) - -import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..)) - -#if !(MIN_VERSION_bytestring(0,10,0)) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) -#endif - -#include "inline.h" - --- | Convert a strict 'BS.ByteString' to a 'Builder'. --- --- /Since: 0.3/ -showbByteStringStrict :: BS.ByteString -> Builder -showbByteStringStrict = showb . FromStringShow -{-# INLINE showbByteStringStrict #-} - --- | Convert a lazy 'BL.ByteString' to a 'Builder'. --- --- /Since: 0.3/ -showbByteStringLazy :: BL.ByteString -> Builder -showbByteStringLazy = showbByteStringLazyPrec 0 -{-# INLINE showbByteStringLazy #-} - --- | Convert a lazy 'BL.ByteString' to a 'Builder' with the given precedence. --- --- With @bytestring-0.10.0.0@ or later, this function ignores the precedence --- argument, since lazy 'BL.ByteString's are printed out identically to 'String's. --- On earlier versions of @bytestring@, however, lazy 'BL.ByteString's can be printed --- with parentheses (e.g., @Chunk "example" Empty@ vs. @(Chunk "example" Empty)@) --- depending on the precedence. --- --- /Since: 0.3/ -showbByteStringLazyPrec :: Int -> BL.ByteString -> Builder -#if MIN_VERSION_bytestring(0,10,0) -showbByteStringLazyPrec _ = showb . FromStringShow -#else -showbByteStringLazyPrec = showbPrec -#endif -{-# INLINE showbByteStringLazyPrec #-} - --- | Convert a 'ShortByteString' to a 'Builder'. --- --- /Since: 0.7/ -showbShortByteString :: ShortByteString -> Builder -showbShortByteString = showb . FromStringShow -{-# INLINE showbShortByteString #-} - -instance Show BS.ByteString where - showb = showbByteStringStrict - INLINE_INST_FUN(showb) - -#if MIN_VERSION_bytestring(0,10,0) -instance Show BL.ByteString where - showbPrec = showbByteStringLazyPrec - INLINE_INST_FUN(showbPrec) -#else -$(deriveShowPragmas defaultInlineShowbPrec ''BL.ByteString) -#endif - -instance Show ShortByteString where - showb = showbShortByteString - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+#if !(MIN_VERSION_bytestring(0,10,0))+{-# LANGUAGE TemplateHaskell #-}+#endif+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.ByteString+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @bytestring@ library.++/Since: 0.3/+-}+module Text.Show.Text.Data.ByteString (+ showbByteStringStrict+ , showbByteStringLazy+ , showbByteStringLazyPrec+ , showbShortByteString+ ) where++import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as BL+import Data.ByteString.Short (ShortByteString)+import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show(show))++import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..))++#if !(MIN_VERSION_bytestring(0,10,0))+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)+#endif++#include "inline.h"++-- | Convert a strict 'BS.ByteString' to a 'Builder'.+-- +-- /Since: 0.3/+showbByteStringStrict :: BS.ByteString -> Builder+showbByteStringStrict = showb . FromStringShow+{-# INLINE showbByteStringStrict #-}++-- | Convert a lazy 'BL.ByteString' to a 'Builder'.+-- +-- /Since: 0.3/+showbByteStringLazy :: BL.ByteString -> Builder+showbByteStringLazy = showbByteStringLazyPrec 0+{-# INLINE showbByteStringLazy #-}++-- | Convert a lazy 'BL.ByteString' to a 'Builder' with the given precedence.+-- +-- With @bytestring-0.10.0.0@ or later, this function ignores the precedence+-- argument, since lazy 'BL.ByteString's are printed out identically to 'String's.+-- On earlier versions of @bytestring@, however, lazy 'BL.ByteString's can be printed+-- with parentheses (e.g., @Chunk "example" Empty@ vs. @(Chunk "example" Empty)@)+-- depending on the precedence.+-- +-- /Since: 0.3/+showbByteStringLazyPrec :: Int -> BL.ByteString -> Builder+#if MIN_VERSION_bytestring(0,10,0)+showbByteStringLazyPrec _ = showb . FromStringShow+#else+showbByteStringLazyPrec = showbPrec+#endif+{-# INLINE showbByteStringLazyPrec #-}++-- | Convert a 'ShortByteString' to a 'Builder'.+-- +-- /Since: 0.7/+showbShortByteString :: ShortByteString -> Builder+showbShortByteString = showb . FromStringShow+{-# INLINE showbShortByteString #-}++instance Show BS.ByteString where+ showb = showbByteStringStrict+ INLINE_INST_FUN(showb)++#if MIN_VERSION_bytestring(0,10,0)+instance Show BL.ByteString where+ showbPrec = showbByteStringLazyPrec+ INLINE_INST_FUN(showbPrec)+#else+$(deriveShowPragmas defaultInlineShowbPrec ''BL.ByteString)+#endif++instance Show ShortByteString where+ showb = showbShortByteString+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/Char.hs view
@@ -1,110 +1,109 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Char -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Char' and 'String'. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Char ( - showbChar - , showbLitChar - , showbString - , showbLitString - , showbGeneralCategory - , asciiTabB - ) where - -import Data.Array (Array, (!), listArray) -import Data.Char (GeneralCategory, isDigit, ord) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -#endif -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(..)) -import Text.Show.Text.Data.Integral (showbIntPrec) -import Text.Show.Text.TH.Internal (deriveShow) -import Text.Show.Text.Utils ((<>), s) - -#include "inline.h" - --- | A table of ASCII control characters that needs to be escaped with a backslash. --- --- /Since: 0.5/ -asciiTabB :: Array Int Builder -asciiTabB = listArray (0, 32) ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", - "BS" , "HT" , "LF" , "VT" , "FF" , "CR" , "SO" , "SI" , - "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", - "CAN", "EM" , "SUB", "ESC", "FS" , "GS" , "RS" , "US" , - "SP"] - --- | Convert a 'Char' to a 'Builder' (surrounded by single quotes). --- --- /Since: 0.3/ -showbChar :: Char -> Builder -showbChar '\'' = "'\\''" -showbChar c = s '\'' <> showbLitChar c <> s '\'' -{-# INLINE showbChar #-} - --- | Convert a 'Char' to a 'Builder' (without single quotes). --- --- /Since: 0.3/ -showbLitChar :: Char -> Builder -showbLitChar c | c > '\DEL' = s '\\' <> showbIntPrec 0 (ord c) -showbLitChar '\DEL' = "\\DEL" -showbLitChar '\\' = "\\\\" -showbLitChar c | c >= ' ' = s c -showbLitChar '\a' = "\\a" -showbLitChar '\b' = "\\b" -showbLitChar '\f' = "\\f" -showbLitChar '\n' = "\\n" -showbLitChar '\r' = "\\r" -showbLitChar '\t' = "\\t" -showbLitChar '\v' = "\\v" -showbLitChar '\SO' = "\\SO" -showbLitChar c = s '\\' <> (asciiTabB ! ord c) - --- | Convert a 'String' to a 'Builder' (surrounded by double quotes). --- --- /Since: 0.3/ -showbString :: String -> Builder -showbString cs = s '"' <> showbLitString cs <> s '"' -{-# INLINE showbString #-} - --- | Convert a 'String' to a 'Builder' (without double quotes). --- --- /Since: 0.3/ -showbLitString :: String -> Builder -showbLitString [] = mempty -showbLitString ('\SO':'H':cs) = "\\SO\\&H" <> showbLitString cs -showbLitString ('"':cs) = "\\\"" <> showbLitString cs -showbLitString (c:d:cs) - | c > '\DEL' && isDigit d = s '\\' <> showbIntPrec 0 (ord c) <> "\\&" <> s d <> showbLitString cs -showbLitString (c:cs) = showbLitChar c <> showbLitString cs - --- | Convert a 'GeneralCategory' to a 'Builder'. --- --- /Since: 0.3/ -showbGeneralCategory :: GeneralCategory -> Builder -showbGeneralCategory = showb -{-# INLINE showbGeneralCategory #-} - -instance Show Char where - showb = showbChar - INLINE_INST_FUN(showb) - - showbList = showbString - INLINE_INST_FUN(showbList) - -$(deriveShow ''GeneralCategory) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Char+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Char' and 'String'.++/Since: 0.3/+-}+module Text.Show.Text.Data.Char (+ showbChar+ , showbLitChar+ , showbString+ , showbLitString+ , showbGeneralCategory+ , asciiTabB+ ) where++import Data.Array (Array, (!), listArray)+import Data.Char (GeneralCategory, isDigit, ord)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(..))+import Text.Show.Text.Data.Integral (showbIntPrec)+import Text.Show.Text.TH.Internal (deriveShow)+import Text.Show.Text.Utils (s)++#include "inline.h"++-- | A table of ASCII control characters that needs to be escaped with a backslash.+-- +-- /Since: 0.5/+asciiTabB :: Array Int Builder+asciiTabB = listArray (0, 32) ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",+ "BS" , "HT" , "LF" , "VT" , "FF" , "CR" , "SO" , "SI" ,+ "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",+ "CAN", "EM" , "SUB", "ESC", "FS" , "GS" , "RS" , "US" ,+ "SP"]++-- | Convert a 'Char' to a 'Builder' (surrounded by single quotes).+-- +-- /Since: 0.3/+showbChar :: Char -> Builder+showbChar '\'' = "'\\''"+showbChar c = s '\'' <> showbLitChar c <> s '\''+{-# INLINE showbChar #-}++-- | Convert a 'Char' to a 'Builder' (without single quotes).+-- +-- /Since: 0.3/+showbLitChar :: Char -> Builder+showbLitChar c | c > '\DEL' = s '\\' <> showbIntPrec 0 (ord c)+showbLitChar '\DEL' = "\\DEL"+showbLitChar '\\' = "\\\\"+showbLitChar c | c >= ' ' = s c+showbLitChar '\a' = "\\a"+showbLitChar '\b' = "\\b"+showbLitChar '\f' = "\\f"+showbLitChar '\n' = "\\n"+showbLitChar '\r' = "\\r"+showbLitChar '\t' = "\\t"+showbLitChar '\v' = "\\v"+showbLitChar '\SO' = "\\SO"+showbLitChar c = s '\\' <> (asciiTabB ! ord c)++-- | Convert a 'String' to a 'Builder' (surrounded by double quotes).+-- +-- /Since: 0.3/+showbString :: String -> Builder+showbString cs = s '"' <> showbLitString cs <> s '"'+{-# INLINE showbString #-}++-- | Convert a 'String' to a 'Builder' (without double quotes).+-- +-- /Since: 0.3/+showbLitString :: String -> Builder+showbLitString [] = mempty+showbLitString ('\SO':'H':cs) = "\\SO\\&H" <> showbLitString cs+showbLitString ('"':cs) = "\\\"" <> showbLitString cs+showbLitString (c:d:cs)+ | c > '\DEL' && isDigit d = s '\\' <> showbIntPrec 0 (ord c) <> "\\&" <> s d <> showbLitString cs+showbLitString (c:cs) = showbLitChar c <> showbLitString cs++-- | Convert a 'GeneralCategory' to a 'Builder'.+-- +-- /Since: 0.3/+showbGeneralCategory :: GeneralCategory -> Builder+showbGeneralCategory = showb+{-# INLINE showbGeneralCategory #-}++instance Show Char where+ showb = showbChar+ INLINE_INST_FUN(showb)+ + showbList = showbString+ INLINE_INST_FUN(showbList)++$(deriveShow ''GeneralCategory)
src/Text/Show/Text/Data/Complex.hs view
@@ -1,66 +1,69 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Ratio -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Ratio' values. - -/Since: 0.5/ --} -module Text.Show.Text.Data.Complex (showbComplexPrec) where - -import Data.Complex (Complex) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec)) -import Text.Show.Text.Data.Floating () -#if MIN_VERSION_base(4,4,0) -import Text.Show.Text.Classes (Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec, - specializeTypes) -#else -import Text.Show.Text.TH.Internal (mkShowbPrec) -#endif - -#include "inline.h" - --- | Convert a 'Complex' value to a 'Builder' with the given precedence. --- --- /Since: 0.5/ -#if MIN_VERSION_base(4,4,0) -showbComplexPrec :: Show a -#else -showbComplexPrec :: (RealFloat a, Show a) -#endif - => Int - -> Complex a - -> Builder -showbComplexPrec = showbPrec -{-# INLINE showbComplexPrec #-} - -#if MIN_VERSION_base(4,4,0) -$(deriveShowPragmas defaultInlineShowbPrec { - specializeTypes = [ [t| Complex Float |] - , [t| Complex Double |] - ] - } - ''Complex) - -instance Show1 Complex where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) -#else -instance (RealFloat a, Show a) => Show (Complex a) where - {-# SPECIALIZE instance Show (Complex Float) #-} - {-# SPECIALIZE instance Show (Complex Double) #-} - showbPrec = $(mkShowbPrec ''Complex) - INLINE_INST_FUN(showbPrec) -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Ratio+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Ratio' values.++/Since: 0.5/+-}+module Text.Show.Text.Data.Complex (showbComplexPrec) where++import Data.Complex (Complex)+import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec))+import Text.Show.Text.Data.Floating ()+#if MIN_VERSION_base(4,4,0)+import Text.Show.Text.Classes (Show1(showbPrec1))+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec,+ specializeTypes)+#else+import Text.Show.Text.TH.Internal (mkShowbPrec)+#endif++#include "inline.h"++-- | Convert a 'Complex' value to a 'Builder' with the given precedence.+-- +-- Note that on @base-4.3.0.0@, this function must have a @('Show' a, 'RealFloat' a)@+-- constraint instead of just a @('Show' a)@ constraint.+-- /Since: 0.5/+#if MIN_VERSION_base(4,4,0)+showbComplexPrec :: Show a+#else+showbComplexPrec :: (RealFloat a, Show a)+#endif+ => Int+ -> Complex a+ -> Builder+showbComplexPrec = showbPrec+{-# INLINE showbComplexPrec #-}++-- TODO: Only use TH when context solver is improved+#if MIN_VERSION_base(4,4,0)+$(deriveShowPragmas defaultInlineShowbPrec {+ specializeTypes = [ [t| Complex Float |]+ , [t| Complex Double |]+ ]+ }+ ''Complex)++instance Show1 Complex where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)+#else+instance (RealFloat a, Show a) => Show (Complex a) where+ {-# SPECIALIZE instance Show (Complex Float) #-}+ {-# SPECIALIZE instance Show (Complex Double) #-}+ showbPrec = $(mkShowbPrec ''Complex)+ INLINE_INST_FUN(showbPrec)+#endif
src/Text/Show/Text/Data/Data.hs view
@@ -1,79 +1,79 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Data -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @Data.Data@ module. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Data ( - showbConstr - , showbConstrRepPrec - , showbDataRepPrec - , showbDataTypePrec - , showbFixity - ) where - -import Data.Data (Constr, ConstrRep, DataRep, DataType, Fixity, showConstr) -import Data.Text.Lazy.Builder (Builder, fromString) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec)) -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Ratio () -import Text.Show.Text.TH.Internal (deriveShow, deriveShowPragmas, - defaultInlineShowbPrec, defaultInlineShowb) - -#include "inline.h" - --- | Convert a 'DataType' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbDataTypePrec :: Int -> DataType -> Builder -showbDataTypePrec = showbPrec -{-# INLINE showbDataTypePrec #-} - --- | Convert a 'DataRep' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbDataRepPrec :: Int -> DataRep -> Builder -showbDataRepPrec = showbPrec -{-# INLINE showbDataRepPrec #-} - --- | Convert a 'Constr' to a 'Builder'. --- --- /Since: 0.3/ -showbConstr :: Constr -> Builder -showbConstr = fromString . showConstr -{-# INLINE showbConstr #-} - --- | Convert a 'Fixity' value to a 'Builder'. --- --- /Since: 0.3/ -showbFixity :: Fixity -> Builder -showbFixity = showb -{-# INLINE showbFixity #-} - --- | Convert a 'ConstrRep' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbConstrRepPrec :: Int -> ConstrRep -> Builder -showbConstrRepPrec = showbPrec -{-# INLINE showbConstrRepPrec #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''DataType) -$(deriveShow ''DataRep) -$(deriveShow ''ConstrRep) -$(deriveShowPragmas defaultInlineShowb ''Fixity) - -instance Show Constr where - showb = showbConstr - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Data+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @Data.Data@ module.++/Since: 0.3/+-}+module Text.Show.Text.Data.Data (+ showbConstr+ , showbConstrRepPrec+ , showbDataRepPrec+ , showbDataTypePrec+ , showbFixity+ ) where++import Data.Data (Constr, ConstrRep, DataRep, DataType, Fixity, showConstr)+import Data.Text.Lazy.Builder (Builder, fromString)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Ratio ()+import Text.Show.Text.TH.Internal (deriveShow, deriveShowPragmas,+ defaultInlineShowbPrec, defaultInlineShowb)++#include "inline.h"++-- | Convert a 'DataType' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbDataTypePrec :: Int -> DataType -> Builder+showbDataTypePrec = showbPrec+{-# INLINE showbDataTypePrec #-}++-- | Convert a 'DataRep' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbDataRepPrec :: Int -> DataRep -> Builder+showbDataRepPrec = showbPrec+{-# INLINE showbDataRepPrec #-}++-- | Convert a 'Constr' to a 'Builder'.+-- +-- /Since: 0.3/+showbConstr :: Constr -> Builder+showbConstr = fromString . showConstr+{-# INLINE showbConstr #-}++-- | Convert a 'Fixity' value to a 'Builder'.+-- +-- /Since: 0.3/+showbFixity :: Fixity -> Builder+showbFixity = showb+{-# INLINE showbFixity #-}++-- | Convert a 'ConstrRep' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbConstrRepPrec :: Int -> ConstrRep -> Builder+showbConstrRepPrec = showbPrec+{-# INLINE showbConstrRepPrec #-}++$(deriveShowPragmas defaultInlineShowbPrec ''DataType)+$(deriveShow ''DataRep)+$(deriveShow ''ConstrRep)+$(deriveShowPragmas defaultInlineShowb ''Fixity)++instance Show Constr where+ showb = showbConstr+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/Dynamic.hs view
@@ -1,38 +1,38 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Dynamic -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Dynamic'. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Dynamic (showbDynamic) where - -import Data.Dynamic (Dynamic, dynTypeRep) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb)) -import Text.Show.Text.Data.Typeable (showbTypeRepPrec) -import Text.Show.Text.Utils ((<>)) - -#include "inline.h" - --- | Convert a 'Dynamic' value to a 'Builder'. --- --- /Since: 0.3/ -showbDynamic :: Dynamic -> Builder -showbDynamic dyn = "<<" <> showbTypeRepPrec 0 (dynTypeRep dyn) <> ">>" -{-# INLINE showbDynamic #-} - -instance Show Dynamic where - showb = showbDynamic - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Dynamic+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Dynamic'.++/Since: 0.3/+-}+module Text.Show.Text.Data.Dynamic (showbDynamic) where++import Data.Dynamic (Dynamic, dynTypeRep)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import Prelude ()++import Text.Show.Text.Classes (Show(showb))+import Text.Show.Text.Data.Typeable (showbTypeRepPrec)++#include "inline.h"++-- | Convert a 'Dynamic' value to a 'Builder'.+-- +-- /Since: 0.3/+showbDynamic :: Dynamic -> Builder+showbDynamic dyn = "<<" <> showbTypeRepPrec 0 (dynTypeRep dyn) <> ">>"+{-# INLINE showbDynamic #-}++instance Show Dynamic where+ showb = showbDynamic+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/Either.hs view
@@ -1,38 +1,38 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Either -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Either' values. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Either (showbEitherPrec) where - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) - -#include "inline.h" - --- | Convert a 'Either' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbEitherPrec :: (Show a, Show b) => Int -> Either a b -> Builder -showbEitherPrec = showbPrec -{-# INLINE showbEitherPrec #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Either) - -instance Show a => Show1 (Either a) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Either+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Either' values.++/Since: 0.3/+-}+module Text.Show.Text.Data.Either (showbEitherPrec) where++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++#include "inline.h"++-- | Convert a 'Either' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbEitherPrec :: (Show a, Show b) => Int -> Either a b -> Builder+showbEitherPrec = showbPrec+{-# INLINE showbEitherPrec #-}++$(deriveShowPragmas defaultInlineShowbPrec ''Either)++instance Show a => Show1 (Either a) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Fixed.hs view
@@ -1,93 +1,92 @@-{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Fixed -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Fixed' values. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Fixed (showbFixed) where - -import Data.Fixed (HasResolution(..)) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb)) - -#if MIN_VERSION_base(4,7,0) -import Data.Fixed (Fixed(..)) -import Data.Int (Int64) -import Data.Semigroup (timesN) -# if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -# endif - -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Utils ((<>), lengthB, s) -#else -import Data.Fixed (Fixed, showFixed) -import Data.Text.Lazy.Builder (fromString) -#endif - -#include "inline.h" - --- | Convert a 'Fixed' value to a 'Builder', where the first argument indicates --- whether to chop off trailing zeroes. --- --- /Since: 0.3/ -showbFixed :: HasResolution a => Bool -> Fixed a -> Builder -#if MIN_VERSION_base(4,7,0) -showbFixed chopTrailingZeroes fa@(MkFixed a) | a < 0 - = s '-' <> showbFixed chopTrailingZeroes (asTypeOf (MkFixed (negate a)) fa) -showbFixed chopTrailingZeroes fa@(MkFixed a) - = showb i <> withDotB (showbIntegerZeroes chopTrailingZeroes digits fracNum) - where - res = fromInteger $ resolution fa - (i, d) = divMod (fromInteger a) res - digits = ceiling (logBase 10 (fromInteger $ resolution fa) :: Double) - maxnum = 10 ^ digits -# if MIN_VERSION_base(4,8,0) - fracNum = divCeil (d * maxnum) res - divCeil x y = (x + y - 1) `div` y -# else - fracNum = div (d * maxnum) res -# endif -#else -showbFixed chopTrailingZeroes = fromString . showFixed chopTrailingZeroes -{-# INLINE showbFixed #-} -#endif - -#if MIN_VERSION_base(4,7,0) --- | Only works for positive 'Integer's. -showbIntegerZeroes :: Bool -> Int64 -> Integer -> Builder -showbIntegerZeroes True _ 0 = mempty -showbIntegerZeroes chopTrailingZeroes digits a - = timesN (fromIntegral . max 0 $ digits - lengthB sh) (s '0') <> sh' - where - sh, sh' :: Builder - sh = showb a - sh' = if chopTrailingZeroes then chopZeroesB a else sh - --- | Chops off the trailing zeroes of an 'Integer'. -chopZeroesB :: Integer -> Builder -chopZeroesB 0 = mempty -chopZeroesB a | mod a 10 == 0 = chopZeroesB (div a 10) -chopZeroesB a = showb a - --- | Prepends a dot to a non-empty 'Builder'. -withDotB :: Builder -> Builder -withDotB b | b == mempty = mempty - | otherwise = s '.' <> b -{-# INLINE withDotB #-} -#endif - -instance HasResolution a => Show (Fixed a) where - showb = showbFixed False - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Fixed+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Fixed' values.++/Since: 0.3/+-}+module Text.Show.Text.Data.Fixed (showbFixed) where++import Data.Fixed (HasResolution(..))+import Data.Text.Lazy.Builder (Builder)++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(showb))++#if MIN_VERSION_base(4,7,0)+import Data.Fixed (Fixed(..))+import Data.Int (Int64)+import Data.Monoid.Compat ((<>))+import Data.Semigroup (timesN)++import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Utils (lengthB, s)+#else+import Data.Fixed (Fixed, showFixed)+import Data.Text.Lazy.Builder (fromString)+#endif++#include "inline.h"++-- | Convert a 'Fixed' value to a 'Builder', where the first argument indicates+-- whether to chop off trailing zeroes.+-- +-- /Since: 0.3/+showbFixed :: HasResolution a => Bool -> Fixed a -> Builder+#if MIN_VERSION_base(4,7,0)+showbFixed chopTrailingZeroes fa@(MkFixed a) | a < 0+ = s '-' <> showbFixed chopTrailingZeroes (asTypeOf (MkFixed (negate a)) fa)+showbFixed chopTrailingZeroes fa@(MkFixed a)+ = showb i <> withDotB (showbIntegerZeroes chopTrailingZeroes digits fracNum)+ where+ res = fromInteger $ resolution fa+ (i, d) = divMod (fromInteger a) res+ digits = ceiling (logBase 10 (fromInteger $ resolution fa) :: Double)+ maxnum = 10 ^ digits+# if MIN_VERSION_base(4,8,0)+ fracNum = divCeil (d * maxnum) res+ divCeil x y = (x + y - 1) `div` y+# else+ fracNum = div (d * maxnum) res+# endif+#else+showbFixed chopTrailingZeroes = fromString . showFixed chopTrailingZeroes+{-# INLINE showbFixed #-}+#endif++#if MIN_VERSION_base(4,7,0)+-- | Only works for positive 'Integer's.+showbIntegerZeroes :: Bool -> Int64 -> Integer -> Builder+showbIntegerZeroes True _ 0 = mempty+showbIntegerZeroes chopTrailingZeroes digits a+ = timesN (fromIntegral . max 0 $ digits - lengthB sh) (s '0') <> sh'+ where+ sh, sh' :: Builder+ sh = showb a+ sh' = if chopTrailingZeroes then chopZeroesB a else sh++-- | Chops off the trailing zeroes of an 'Integer'.+chopZeroesB :: Integer -> Builder+chopZeroesB 0 = mempty+chopZeroesB a | mod a 10 == 0 = chopZeroesB (div a 10)+chopZeroesB a = showb a++-- | Prepends a dot to a non-empty 'Builder'.+withDotB :: Builder -> Builder+withDotB b | b == mempty = mempty+ | otherwise = s '.' <> b+{-# INLINE withDotB #-}+#endif++instance HasResolution a => Show (Fixed a) where+ showb = showbFixed False+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/Floating.hs view
@@ -1,392 +1,409 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Floating -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for floating-point types. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Floating ( - showbRealFloatPrec - , showbFloatPrec - , showbDoublePrec - , showbEFloat - , showbFFloat - , showbGFloat - , showbFFloatAlt - , showbGFloatAlt - ) where - -import Data.Array.Base (unsafeAt) -import Data.Array.IArray (Array, array) -import qualified Data.Text as T (replicate) -import Data.Text.Lazy.Builder (Builder, fromString, fromText) -import Data.Text.Lazy.Builder.Int (decimal) -import Data.Text.Lazy.Builder.RealFloat (FPFormat(..)) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), showbParen) -import Text.Show.Text.Utils ((<>), i2d, s) - -#include "inline.h" - --- | Convert a 'RealFloat' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbRealFloatPrec :: RealFloat a => Int -> a -> Builder -showbRealFloatPrec p x - | x < 0 || isNegativeZero x = showbParen (p > 6) $ s '-' <> showbGFloat Nothing (-x) - | otherwise = showbGFloat Nothing x -{-# INLINE showbRealFloatPrec #-} - --- | Convert a 'Float' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbFloatPrec :: Int -> Float -> Builder -showbFloatPrec = showbRealFloatPrec -{-# INLINE showbFloatPrec #-} - --- | Convert a 'Double' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbDoublePrec :: Int -> Double -> Builder -showbDoublePrec = showbRealFloatPrec -{-# INLINE showbDoublePrec #-} - --- | Show a signed 'RealFloat' value --- using scientific (exponential) notation (e.g. @2.45e2@, @1.5e-3@). --- --- In the call @'showbEFloat' digs val@, if @digs@ is 'Nothing', --- the value is shown to full precision; if @digs@ is @'Just' d@, --- then at most @d@ digits after the decimal point are shown. --- --- /Since: 0.3/ -showbEFloat :: RealFloat a => Maybe Int -> a -> Builder -showbEFloat = formatRealFloat Exponent -{-# INLINE showbEFloat #-} - --- | Show a signed 'RealFloat' value --- using standard decimal notation (e.g. @245000@, @0.0015@). --- --- In the call @'showbFFloat' digs val@, if @digs@ is 'Nothing', --- the value is shown to full precision; if @digs@ is @'Just' d@, --- then at most @d@ digits after the decimal point are shown. --- --- /Since: 0.3/ -showbFFloat :: RealFloat a => Maybe Int -> a -> Builder -showbFFloat = formatRealFloat Fixed -{-# INLINE showbFFloat #-} - --- | Show a signed 'RealFloat' value --- using standard decimal notation for arguments whose absolute value lies --- between @0.1@ and @9,999,999@, and scientific notation otherwise. --- --- In the call @'showbGFloat' digs val@, if @digs@ is 'Nothing', --- the value is shown to full precision; if @digs@ is @'Just' d@, --- then at most @d@ digits after the decimal point are shown. --- --- /Since: 0.3/ -showbGFloat :: RealFloat a => Maybe Int -> a -> Builder -showbGFloat = formatRealFloat Generic -{-# INLINE showbGFloat #-} - --- | Show a signed 'RealFloat' value --- using standard decimal notation (e.g. @245000@, @0.0015@). --- --- This behaves as 'showFFloat', except that a decimal point --- is always guaranteed, even if not needed. --- --- /Since: 0.3/ -showbFFloatAlt :: RealFloat a => Maybe Int -> a -> Builder -showbFFloatAlt d x = formatRealFloatAlt Fixed d True x -{-# INLINE showbFFloatAlt #-} - --- | Show a signed 'RealFloat' value --- using standard decimal notation for arguments whose absolute value lies --- between @0.1@ and @9,999,999@, and scientific notation otherwise. --- --- This behaves as 'showFFloat', except that a decimal point --- is always guaranteed, even if not needed. --- --- /Since: 0.3/ -showbGFloatAlt :: RealFloat a => Maybe Int -> a -> Builder -showbGFloatAlt d x = formatRealFloatAlt Generic d True x -{-# INLINE showbGFloatAlt #-} - -instance Show Float where - showbPrec = showbFloatPrec - INLINE_INST_FUN(showbPrec) - -instance Show Double where - showbPrec = showbDoublePrec - INLINE_INST_FUN(showbPrec) - -------------------------------------------------------------------------------- --- GHC.Float internal functions, adapted for Builders -------------------------------------------------------------------------------- - --- | Like 'formatRealFloatAlt', except that the decimal is only shown for arguments --- whose absolute value is between @0.1@ and @9,999,999@. -formatRealFloat :: RealFloat a - => FPFormat -- ^ What notation to use. - -> Maybe Int -- ^ Number of decimal places to render. - -> a - -> Builder -formatRealFloat fmt decs = formatRealFloatAlt fmt decs False -{-# INLINE formatRealFloat #-} - --- | Converts a 'RealFloat' value to a Builder. Super-configurable. -formatRealFloatAlt :: RealFloat a - => FPFormat -- ^ What notation to use. - -> Maybe Int -- ^ Number of decimal places to render. - -> Bool -- ^ Should a decimal point always be shown? - -> a - -> Builder -{-# SPECIALIZE formatRealFloatAlt :: FPFormat -> Maybe Int -> Bool -> Float -> Builder #-} -{-# SPECIALIZE formatRealFloatAlt :: FPFormat -> Maybe Int -> Bool -> Double -> Builder #-} -formatRealFloatAlt fmt decs alt x - | isNaN x = "NaN" - | isInfinite x = if x < 0 then "-Infinity" else "Infinity" - | x < 0 || isNegativeZero x = s '-' <> doFmt fmt (floatToDigits (-x)) - | otherwise = doFmt fmt (floatToDigits x) - where - doFmt format (is, e) = - let ds = map i2d is in - case format of - Generic -> - doFmt (if e < 0 || e > 7 then Exponent else Fixed) - (is,e) - Exponent -> - case decs of - Nothing -> - let show_e' = decimal (e-1) in - case ds of - "0" -> "0.0e0" - [d] -> s d <> ".0e" <> show_e' - (d:ds') -> s d <> s '.' <> fromString ds' <> s 'e' <> show_e' - [] -> error "formatRealFloat/doFmt/Exponent: []" - Just dec -> - let dec' = max dec 1 in - case is of - [0] -> "0." <> fromText (T.replicate dec' "0") <> "e0" - _ -> - let - (ei,is') = roundTo (dec'+1) is - (d:ds') = map i2d (if ei > 0 then init is' else is') - in - s d <> s '.' <> fromString ds' <> s 'e' <> decimal (e-1+ei) - Fixed -> - let - mk0 ls = case ls of { "" -> "0" ; _ -> fromString ls} - in - case decs of - Nothing - | e <= 0 -> "0." <> fromText (T.replicate (-e) "0") <> fromString ds - | otherwise -> - let - f 0 str rs = mk0 (reverse str) <> s '.' <> mk0 rs - f n str "" = f (n-1) ('0':str) "" - f n str (r:rs) = f (n-1) (r:str) rs - in - f e "" ds - Just dec -> - let dec' = max dec 0 in - if e >= 0 then - let - (ei,is') = roundTo (dec' + e) is - (ls,rs) = splitAt (e+ei) (map i2d is') - in - mk0 ls <> (if null rs && not alt then "" else s '.' <> fromString rs) - else - let - (ei,is') = roundTo dec' (replicate (-e) 0 ++ is) - d:ds' = map i2d (if ei > 0 then is' else 0:is') - in - s d <> (if null ds' && not alt then "" else s '.' <> fromString ds') - --- Based on "Printing Floating-Point Numbers Quickly and Accurately" --- by R.G. Burger and R.K. Dybvig in PLDI 96. --- This version uses a much slower logarithm estimator. It should be improved. - --- | 'floatToDigits' takes a base and a non-negative 'RealFloat' number, --- and returns a list of digits and an exponent. --- In particular, if @x>=0@, and --- --- > floatToDigits base x = ([d1,d2,...,dn], e) --- --- then --- --- (1) @n >= 1@ --- --- (2) @x = 0.d1d2...dn * (base**e)@ --- --- (3) @0 <= di <= base-1@ -floatToDigits :: (RealFloat a) => a -> ([Int], Int) -{-# SPECIALIZE floatToDigits :: Float -> ([Int], Int) #-} -{-# SPECIALIZE floatToDigits :: Double -> ([Int], Int) #-} -floatToDigits 0 = ([0], 0) -floatToDigits x = - let - (f0, e0) = decodeFloat x - (minExp0, _) = floatRange x - p = floatDigits x - b = floatRadix x - minExp = minExp0 - p -- the real minimum exponent - -- Haskell requires that f be adjusted so denormalized numbers - -- will have an impossibly low exponent. Adjust for this. - (f, e) = - let n = minExp - e0 in - if n > 0 then (f0 `quot` (expt b n), e0+n) else (f0, e0) - (r, s', mUp, mDn) = - if e >= 0 then - let be = expt b e in - if f == expt b (p-1) then - (f*be*b*2, 2*b, be*b, be) -- according to Burger and Dybvig - else - (f*be*2, 2, be, be) - else - if e > minExp && f == expt b (p-1) then - (f*b*2, expt b (-e+1)*2, b, 1) - else - (f*2, expt b (-e)*2, 1, 1) - k :: Int - k = - let - k0 :: Int - k0 = - if b == 2 then - -- logBase 10 2 is very slightly larger than 8651/28738 - -- (about 5.3558e-10), so if log x >= 0, the approximation - -- k1 is too small, hence we add one and need one fixup step less. - -- If log x < 0, the approximation errs rather on the high side. - -- That is usually more than compensated for by ignoring the - -- fractional part of logBase 2 x, but when x is a power of 1/2 - -- or slightly larger and the exponent is a multiple of the - -- denominator of the rational approximation to logBase 10 2, - -- k1 is larger than logBase 10 x. If k1 > 1 + logBase 10 x, - -- we get a leading zero-digit we don't want. - -- With the approximation 3/10, this happened for - -- 0.5^1030, 0.5^1040, ..., 0.5^1070 and values close above. - -- The approximation 8651/28738 guarantees k1 < 1 + logBase 10 x - -- for IEEE-ish floating point types with exponent fields - -- <= 17 bits and mantissae of several thousand bits, earlier - -- convergents to logBase 10 2 would fail for long double. - -- Using quot instead of div is a little faster and requires - -- fewer fixup steps for negative lx. - let lx = p - 1 + e0 - k1 = (lx * 8651) `quot` 28738 - in if lx >= 0 then k1 + 1 else k1 - else - -- f :: Integer, log :: Float -> Float, - -- ceiling :: Float -> Int - ceiling ((log (fromInteger (f+1) :: Float) + - fromIntegral e * log (fromInteger b)) / - log 10) ---WAS: fromInt e * log (fromInteger b)) - - fixup n = - if n >= 0 then - if r + mUp <= expt 10 n * s' then n else fixup (n+1) - else - if expt 10 (-n) * (r + mUp) <= s' then n else fixup (n+1) - in - fixup k0 - - gen ds rn sN mUpN mDnN = - let - (dn, rn') = (rn * 10) `quotRem` sN - mUpN' = mUpN * 10 - mDnN' = mDnN * 10 - in - case (rn' < mDnN', rn' + mUpN' > sN) of - (True, False) -> dn : ds - (False, True) -> dn+1 : ds - (True, True) -> if rn' * 2 < sN then dn : ds else dn+1 : ds - (False, False) -> gen (dn:ds) rn' sN mUpN' mDnN' - - rds = - if k >= 0 then - gen [] r (s' * expt 10 k) mUp mDn - else - let bk = expt 10 (-k) in - gen [] (r * bk) s' (mUp * bk) (mDn * bk) - in - (map fromIntegral (reverse rds), k) - -roundTo :: Int -> [Int] -> (Int,[Int]) -#if MIN_VERSION_base(4,6,0) -roundTo d is = - case f d True is of - x@(0,_) -> x - (1,xs) -> (1, 1:xs) - _ -> error "roundTo: bad Value" - where - b2 = base `quot` 2 - - f n _ [] = (0, replicate n 0) - f 0 e (x:xs) | x == b2 && e && all (== 0) xs = (0, []) -- Round to even when at exactly half the base - | otherwise = (if x >= b2 then 1 else 0, []) - f n _ (i:xs) - | i' == base = (1,0:ds) - | otherwise = (0,i':ds) - where - (c,ds) = f (n-1) (even i) xs - i' = c + i - base = 10 -#else -roundTo d is = - case f d is of - x@(0,_) -> x - (1,xs) -> (1, 1:xs) - _ -> error "roundTo: bad Value" - where - f n [] = (0, replicate n 0) - f 0 (x:_) = (if x >= 5 then 1 else 0, []) - f n (i:xs) - | i' == 10 = (1,0:ds) - | otherwise = (0,i':ds) - where - (c,ds) = f (n-1) xs - i' = c + i -#endif - - --- Exponentiation with a cache for the most common numbers. - --- | The minimum exponent in the cache. -minExpt :: Int -minExpt = 0 -{-# INLINE minExpt #-} - --- | The maximum exponent (of 2) in the cache. -maxExpt :: Int -maxExpt = 1100 -{-# INLINE maxExpt #-} - --- | Exponentiate an 'Integer', using a cache if possible. -expt :: Integer -> Int -> Integer -expt base n - | base == 2 && n >= minExpt && n <= maxExpt = expts `unsafeAt` n - | base == 10 && n <= maxExpt10 = expts10 `unsafeAt` n - | otherwise = base^n - --- | Cached powers of two. -expts :: Array Int Integer -expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]] - --- | The maximum exponent (of 10) in the cache. -maxExpt10 :: Int -maxExpt10 = 324 -{-# INLINE maxExpt10 #-} - --- | Cached powers of 10. -expts10 :: Array Int Integer -expts10 = array (minExpt,maxExpt10) [(n,10^n) | n <- [minExpt .. maxExpt10]] +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Floating+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for floating-point types.++/Since: 0.3/+-}+module Text.Show.Text.Data.Floating (+ showbRealFloatPrec+ , showbFloatPrec+ , showbDoublePrec+ , showbEFloat+ , showbFFloat+ , showbGFloat+ , showbFFloatAlt+ , showbGFloatAlt+ , FPFormat(..)+ , formatRealFloatB+ , formatRealFloatAltB+ ) where++import Data.Array.Base (unsafeAt)+import Data.Array.IArray (Array, array)+import Data.Monoid.Compat ((<>))+import qualified Data.Text as T (replicate)+import Data.Text.Lazy.Builder (Builder, fromString, fromText)+import Data.Text.Lazy.Builder.Int (decimal)+import Data.Text.Lazy.Builder.RealFloat (FPFormat(..))++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), showbParen)+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb)+import Text.Show.Text.Utils (i2d, s)++#include "inline.h"++-- | Convert a 'RealFloat' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbRealFloatPrec :: RealFloat a => Int -> a -> Builder+showbRealFloatPrec p x+ | x < 0 || isNegativeZero x = showbParen (p > 6) $ s '-' <> showbGFloat Nothing (-x)+ | otherwise = showbGFloat Nothing x+{-# INLINE showbRealFloatPrec #-}++-- | Convert a 'Float' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbFloatPrec :: Int -> Float -> Builder+showbFloatPrec = showbRealFloatPrec+{-# INLINE showbFloatPrec #-}++-- | Convert a 'Double' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbDoublePrec :: Int -> Double -> Builder+showbDoublePrec = showbRealFloatPrec+{-# INLINE showbDoublePrec #-}++-- | Show a signed 'RealFloat' value+-- using scientific (exponential) notation (e.g. @2.45e2@, @1.5e-3@).+-- +-- In the call @'showbEFloat' digs val@, if @digs@ is 'Nothing',+-- the value is shown to full precision; if @digs@ is @'Just' d@,+-- then at most @d@ digits after the decimal point are shown.+-- +-- /Since: 0.3/+showbEFloat :: RealFloat a => Maybe Int -> a -> Builder+showbEFloat = formatRealFloatB Exponent+{-# INLINE showbEFloat #-}++-- | Show a signed 'RealFloat' value+-- using standard decimal notation (e.g. @245000@, @0.0015@).+-- +-- In the call @'showbFFloat' digs val@, if @digs@ is 'Nothing',+-- the value is shown to full precision; if @digs@ is @'Just' d@,+-- then at most @d@ digits after the decimal point are shown.+-- +-- /Since: 0.3/+showbFFloat :: RealFloat a => Maybe Int -> a -> Builder+showbFFloat = formatRealFloatB Fixed+{-# INLINE showbFFloat #-}++-- | Show a signed 'RealFloat' value+-- using standard decimal notation for arguments whose absolute value lies+-- between @0.1@ and @9,999,999@, and scientific notation otherwise.+-- +-- In the call @'showbGFloat' digs val@, if @digs@ is 'Nothing',+-- the value is shown to full precision; if @digs@ is @'Just' d@,+-- then at most @d@ digits after the decimal point are shown.+-- +-- /Since: 0.3/+showbGFloat :: RealFloat a => Maybe Int -> a -> Builder+showbGFloat = formatRealFloatB Generic+{-# INLINE showbGFloat #-}++-- | Show a signed 'RealFloat' value+-- using standard decimal notation (e.g. @245000@, @0.0015@).+-- +-- This behaves as 'showFFloat', except that a decimal point+-- is always guaranteed, even if not needed.+-- +-- /Since: 0.3/+showbFFloatAlt :: RealFloat a => Maybe Int -> a -> Builder+showbFFloatAlt d = formatRealFloatAltB Fixed d True+{-# INLINE showbFFloatAlt #-}++-- | Show a signed 'RealFloat' value+-- using standard decimal notation for arguments whose absolute value lies+-- between @0.1@ and @9,999,999@, and scientific notation otherwise.+-- +-- This behaves as 'showFFloat', except that a decimal point+-- is always guaranteed, even if not needed.+-- +-- /Since: 0.3/+showbGFloatAlt :: RealFloat a => Maybe Int -> a -> Builder+showbGFloatAlt d = formatRealFloatAltB Generic d True+{-# INLINE showbGFloatAlt #-}++instance Show Float where+ showbPrec = showbFloatPrec+ INLINE_INST_FUN(showbPrec)++instance Show Double where+ showbPrec = showbDoublePrec+ INLINE_INST_FUN(showbPrec)++-------------------------------------------------------------------------------+-- GHC.Float internal functions, adapted for Builders+-------------------------------------------------------------------------------++-- | Like 'formatRealFloatAltB', except that the decimal is only shown for arguments+-- whose absolute value is between @0.1@ and @9,999,999@.+-- +-- /Since: 0.8/+formatRealFloatB :: RealFloat a+ => FPFormat -- ^ What notation to use.+ -> Maybe Int -- ^ Number of decimal places to render.+ -> a+ -> Builder+formatRealFloatB fmt decs = formatRealFloatAltB fmt decs False+{-# INLINE formatRealFloatB #-}++-- | Converts a 'RealFloat' value to a Builder, specifying if a decimal point+-- should always be shown.+-- +-- /Since: 0.8/+formatRealFloatAltB :: RealFloat a+ => FPFormat -- ^ What notation to use.+ -> Maybe Int -- ^ Number of decimal places to render.+ -> Bool -- ^ Should a decimal point always be shown?+ -> a+ -> Builder+{-# SPECIALIZE formatRealFloatAltB :: FPFormat -> Maybe Int -> Bool -> Float -> Builder #-}+{-# SPECIALIZE formatRealFloatAltB :: FPFormat -> Maybe Int -> Bool -> Double -> Builder #-}+formatRealFloatAltB fmt decs alt x+ | isNaN x = "NaN"+ | isInfinite x = if x < 0 then "-Infinity" else "Infinity"+ | x < 0 || isNegativeZero x = s '-' <> doFmt fmt (floatToDigits (-x))+ | otherwise = doFmt fmt (floatToDigits x)+ where+ doFmt format (is, e) =+ let ds = map i2d is in+ case format of+ Generic ->+ doFmt (if e < 0 || e > 7 then Exponent else Fixed)+ (is,e)+ Exponent ->+ case decs of+ Nothing ->+ let show_e' = decimal (e-1) in+ case ds of+ "0" -> "0.0e0"+ [d] -> s d <> ".0e" <> show_e'+ (d:ds') -> s d <> s '.' <> fromString ds' <> s 'e' <> show_e'+ [] -> error "formatRealFloat/doFmt/Exponent: []"+ Just dec ->+ let dec' = max dec 1 in+ case is of+ [0] -> "0." <> fromText (T.replicate dec' "0") <> "e0"+ _ ->+ let+ (ei,is') = roundTo (dec'+1) is+ (d:ds') = map i2d (if ei > 0 then init is' else is')+ in+ s d <> s '.' <> fromString ds' <> s 'e' <> decimal (e-1+ei)+ Fixed ->+ let+ mk0 ls = case ls of { "" -> "0" ; _ -> fromString ls}+ in+ case decs of+ Nothing+ | e <= 0 -> "0." <> fromText (T.replicate (-e) "0") <> fromString ds+ | otherwise ->+ let+ f 0 str rs = mk0 (reverse str) <> s '.' <> mk0 rs+ f n str "" = f (n-1) ('0':str) ""+ f n str (r:rs) = f (n-1) (r:str) rs+ in+ f e "" ds+ Just dec ->+ let dec' = max dec 0 in+ if e >= 0 then+ let+ (ei,is') = roundTo (dec' + e) is+ (ls,rs) = splitAt (e+ei) (map i2d is')+ in+ mk0 ls <> (if null rs && not alt then "" else s '.' <> fromString rs)+ else+ let+ (ei,is') = roundTo dec' (replicate (-e) 0 ++ is)+ d:ds' = map i2d (if ei > 0 then is' else 0:is')+ in+ s d <> (if null ds' && not alt then "" else s '.' <> fromString ds')++-- Based on "Printing Floating-Point Numbers Quickly and Accurately"+-- by R.G. Burger and R.K. Dybvig in PLDI 96.+-- This version uses a much slower logarithm estimator. It should be improved.++-- | 'floatToDigits' takes a base and a non-negative 'RealFloat' number,+-- and returns a list of digits and an exponent.+-- In particular, if @x>=0@, and+--+-- > floatToDigits base x = ([d1,d2,...,dn], e)+--+-- then+--+-- (1) @n >= 1@+--+-- (2) @x = 0.d1d2...dn * (base**e)@+--+-- (3) @0 <= di <= base-1@+floatToDigits :: (RealFloat a) => a -> ([Int], Int)+{-# SPECIALIZE floatToDigits :: Float -> ([Int], Int) #-}+{-# SPECIALIZE floatToDigits :: Double -> ([Int], Int) #-}+floatToDigits 0 = ([0], 0)+floatToDigits x =+ let+ (f0, e0) = decodeFloat x+ (minExp0, _) = floatRange x+ p = floatDigits x+ b = floatRadix x+ minExp = minExp0 - p -- the real minimum exponent+ -- Haskell requires that f be adjusted so denormalized numbers+ -- will have an impossibly low exponent. Adjust for this.+ (f, e) =+ let n = minExp - e0 in+ if n > 0 then (f0 `quot` (expt b n), e0+n) else (f0, e0)+ (r, s', mUp, mDn) =+ if e >= 0 then+ let be = expt b e in+ if f == expt b (p-1) then+ (f*be*b*2, 2*b, be*b, be) -- according to Burger and Dybvig+ else+ (f*be*2, 2, be, be)+ else+ if e > minExp && f == expt b (p-1) then+ (f*b*2, expt b (-e+1)*2, b, 1)+ else+ (f*2, expt b (-e)*2, 1, 1)+ k :: Int+ k =+ let+ k0 :: Int+ k0 =+ if b == 2 then+ -- logBase 10 2 is very slightly larger than 8651/28738+ -- (about 5.3558e-10), so if log x >= 0, the approximation+ -- k1 is too small, hence we add one and need one fixup step less.+ -- If log x < 0, the approximation errs rather on the high side.+ -- That is usually more than compensated for by ignoring the+ -- fractional part of logBase 2 x, but when x is a power of 1/2+ -- or slightly larger and the exponent is a multiple of the+ -- denominator of the rational approximation to logBase 10 2,+ -- k1 is larger than logBase 10 x. If k1 > 1 + logBase 10 x,+ -- we get a leading zero-digit we don't want.+ -- With the approximation 3/10, this happened for+ -- 0.5^1030, 0.5^1040, ..., 0.5^1070 and values close above.+ -- The approximation 8651/28738 guarantees k1 < 1 + logBase 10 x+ -- for IEEE-ish floating point types with exponent fields+ -- <= 17 bits and mantissae of several thousand bits, earlier+ -- convergents to logBase 10 2 would fail for long double.+ -- Using quot instead of div is a little faster and requires+ -- fewer fixup steps for negative lx.+ let lx = p - 1 + e0+ k1 = (lx * 8651) `quot` 28738+ in if lx >= 0 then k1 + 1 else k1+ else+ -- f :: Integer, log :: Float -> Float,+ -- ceiling :: Float -> Int+ ceiling ((log (fromInteger (f+1) :: Float) ++ fromIntegral e * log (fromInteger b)) /+ log 10)+--WAS: fromInt e * log (fromInteger b))++ fixup n =+ if n >= 0 then+ if r + mUp <= expt 10 n * s' then n else fixup (n+1)+ else+ if expt 10 (-n) * (r + mUp) <= s' then n else fixup (n+1)+ in+ fixup k0++ gen ds rn sN mUpN mDnN =+ let+ (dn, rn') = (rn * 10) `quotRem` sN+ mUpN' = mUpN * 10+ mDnN' = mDnN * 10+ in+ case (rn' < mDnN', rn' + mUpN' > sN) of+ (True, False) -> dn : ds+ (False, True) -> dn+1 : ds+ (True, True) -> if rn' * 2 < sN then dn : ds else dn+1 : ds+ (False, False) -> gen (dn:ds) rn' sN mUpN' mDnN'++ rds =+ if k >= 0 then+ gen [] r (s' * expt 10 k) mUp mDn+ else+ let bk = expt 10 (-k) in+ gen [] (r * bk) s' (mUp * bk) (mDn * bk)+ in+ (map fromIntegral (reverse rds), k)++roundTo :: Int -> [Int] -> (Int,[Int])+#if MIN_VERSION_base(4,6,0)+roundTo d is =+ case f d True is of+ x@(0,_) -> x+ (1,xs) -> (1, 1:xs)+ _ -> error "roundTo: bad Value"+ where+ b2 = base `quot` 2++ f n _ [] = (0, replicate n 0)+ f 0 e (x:xs) | x == b2 && e && all (== 0) xs = (0, []) -- Round to even when at exactly half the base+ | otherwise = (if x >= b2 then 1 else 0, [])+ f n _ (i:xs)+ | i' == base = (1,0:ds)+ | otherwise = (0,i':ds)+ where+ (c,ds) = f (n-1) (even i) xs+ i' = c + i+ base = 10+#else+roundTo d is =+ case f d is of+ x@(0,_) -> x+ (1,xs) -> (1, 1:xs)+ _ -> error "roundTo: bad Value"+ where+ f n [] = (0, replicate n 0)+ f 0 (x:_) = (if x >= 5 then 1 else 0, [])+ f n (i:xs)+ | i' == 10 = (1,0:ds)+ | otherwise = (0,i':ds)+ where+ (c,ds) = f (n-1) xs+ i' = c + i+#endif+++-- Exponentiation with a cache for the most common numbers.++-- | The minimum exponent in the cache.+minExpt :: Int+minExpt = 0+{-# INLINE minExpt #-}++-- | The maximum exponent (of 2) in the cache.+maxExpt :: Int+maxExpt = 1100+{-# INLINE maxExpt #-}++-- | Exponentiate an 'Integer', using a cache if possible.+expt :: Integer -> Int -> Integer+expt base n+ | base == 2 && n >= minExpt && n <= maxExpt = expts `unsafeAt` n+ | base == 10 && n <= maxExpt10 = expts10 `unsafeAt` n+ | otherwise = base^n++-- | Cached powers of two.+expts :: Array Int Integer+expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]]++-- | The maximum exponent (of 10) in the cache.+maxExpt10 :: Int+maxExpt10 = 324+{-# INLINE maxExpt10 #-}++-- | Cached powers of 10.+expts10 :: Array Int Integer+expts10 = array (minExpt,maxExpt10) [(n,10^n) | n <- [minExpt .. maxExpt10]]++-------------------------------------------------------------------------------+-- Orphan instance for FPFormat+-------------------------------------------------------------------------------++$(deriveShowPragmas defaultInlineShowb ''FPFormat)
src/Text/Show/Text/Data/Functor/Identity.hs view
@@ -1,42 +1,42 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Functor.Identity -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Identity' values. - -/Since: 0.5/ --} -module Text.Show.Text.Data.Functor.Identity (showbIdentityPrec) where - -import Data.Functor.Identity (Identity(..)) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1), showbUnary) - -#include "inline.h" - --- | Convert an 'Identity' value to a 'Builder' with the given precedence. --- --- /Since: 0.5/ -showbIdentityPrec :: Show a => Int -> Identity a -> Builder --- This would be equivalent to the derived instance of 'Identity' if the --- 'runIdentity' field were removed. -showbIdentityPrec p (Identity x) = showbUnary "Identity" p x -{-# INLINE showbIdentityPrec #-} - -instance Show a => Show (Identity a) where - showbPrec = showbIdentityPrec - {-# INLINE showbPrec #-} - -instance Show1 Identity where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Functor.Identity+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Identity' values.++/Since: 0.5/+-}+module Text.Show.Text.Data.Functor.Identity (showbIdentityPrec) where++import Data.Functor.Identity (Identity(..))+import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1), showbUnary)++#include "inline.h"++-- | Convert an 'Identity' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.5/+showbIdentityPrec :: Show a => Int -> Identity a -> Builder+-- This would be equivalent to the derived instance of 'Identity' if the+-- 'runIdentity' field were removed.+showbIdentityPrec p (Identity x) = showbUnary "Identity" p x+{-# INLINE showbIdentityPrec #-}++instance Show a => Show (Identity a) where+ showbPrec = showbIdentityPrec+ {-# INLINE showbPrec #-}++instance Show1 Identity where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Integral.hs view
@@ -1,249 +1,241 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Integral -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for integral types. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Integral ( - showbIntPrec - , showbInt8Prec - , showbInt16Prec - , showbInt32Prec - , showbInt64Prec - , showbIntegerPrec - , showbIntegralPrec - , showbIntAtBase - , showbBin - , showbHex - , showbOct - , showbWord - , showbWord8 - , showbWord16 - , showbWord32 - , showbWord64 - ) where - -import Data.Char (intToDigit) -import Data.Int (Int8, Int16, Int32, Int64) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -#endif -import Data.Text.Lazy.Builder (Builder) -import Data.Text.Lazy.Builder.Int (decimal) -import Data.Word ( Word8 - , Word16 - , Word32 - , Word64 -#if !(MIN_VERSION_base(4,8,0)) - , Word -#endif - ) - -import GHC.Exts (Int(I#)) -#if __GLASGOW_HASKELL__ >= 708 -import GHC.Exts (isTrue#) -import GHC.Prim (Int#) -#endif -import GHC.Prim ((<#), (>#)) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec)) -import Text.Show.Text.Utils ((<>), s, toString) - -#include "inline.h" - --- | Convert an 'Int' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbIntPrec :: Int -> Int -> Builder -showbIntPrec (I# p) n'@(I# n) - | isTrue (n <# 0#) && isTrue (p ># 6#) = s '(' <> decimal n' <> s ')' - | otherwise = decimal n' - where -#if __GLASGOW_HASKELL__ >= 708 - isTrue :: Int# -> Bool - isTrue b = isTrue# b -#else - isTrue :: Bool -> Bool - isTrue = id -#endif - --- | Convert an 'Int8' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbInt8Prec :: Int -> Int8 -> Builder -showbInt8Prec p = showbIntPrec p . fromIntegral -{-# INLINE showbInt8Prec #-} - --- | Convert an 'Int16' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbInt16Prec :: Int -> Int16 -> Builder -showbInt16Prec p = showbIntPrec p . fromIntegral -{-# INLINE showbInt16Prec #-} - --- | Convert an 'Int32' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbInt32Prec :: Int -> Int32 -> Builder -showbInt32Prec p = showbIntPrec p . fromIntegral -{-# INLINE showbInt32Prec #-} - --- | Convert an 'Int64' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbInt64Prec :: Int -> Int64 -> Builder -#if WORD_SIZE_IN_BITS < 64 -showbInt64Prec p = showbIntegerPrec p . toInteger -#else -showbInt64Prec p = showbIntPrec p . fromIntegral -#endif -{-# INLINE showbInt64Prec #-} - --- | Convert an 'Integer' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbIntegerPrec :: Int -> Integer -> Builder -showbIntegerPrec p n - | p > 6 && n < 0 = s '(' <> decimal n <> s ')' - | otherwise = decimal n -{-# INLINE showbIntegerPrec #-} - --- | Convert an 'Integral' type to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbIntegralPrec :: Integral a => Int -> a -> Builder -showbIntegralPrec p = showbIntegerPrec p . toInteger -{-# INLINE showbIntegralPrec #-} - --- | Shows a /non-negative/ 'Integral' number using the base specified by the --- first argument, and the character representation specified by the second. --- --- /Since: 0.3/ -showbIntAtBase :: (Integral a, Show a) => a -> (Int -> Char) -> a -> Builder -showbIntAtBase base toChr n0 - | base <= 1 = error . toString $ "Text.Show.Text.Int.showbIntAtBase: applied to unsupported base" <> showb base - | n0 < 0 = error . toString $ "Text.Show.Text.Int.showbIntAtBase: applied to negative number " <> showb n0 - | otherwise = showbIt (quotRem n0 base) mempty - where - showbIt (n, d) b = seq c $ -- stricter than necessary - case n of - 0 -> b' - _ -> showbIt (quotRem n base) b' - where - c :: Char - c = toChr $ fromIntegral d - - b' :: Builder - b' = s c <> b - --- | Show /non-negative/ 'Integral' numbers in base 2. --- --- /Since: 0.3/ -showbBin :: (Integral a, Show a) => a -> Builder -showbBin = showbIntAtBase 2 intToDigit -{-# INLINE showbBin #-} - --- | Show /non-negative/ 'Integral' numbers in base 16. --- --- /Since: 0.3/ -showbHex :: (Integral a, Show a) => a -> Builder -showbHex = showbIntAtBase 16 intToDigit -{-# INLINE showbHex #-} - --- | Show /non-negative/ 'Integral' numbers in base 8. --- --- /Since: 0.3/ -showbOct :: (Integral a, Show a) => a -> Builder -showbOct = showbIntAtBase 8 intToDigit -{-# INLINE showbOct #-} - --- | Convert a 'Word' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbWord :: Word -> Builder -showbWord = decimal -{-# INLINE showbWord #-} - --- | Convert a 'Word8' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbWord8 :: Word8 -> Builder -showbWord8 = decimal -{-# INLINE showbWord8 #-} - --- | Convert a 'Word16' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbWord16 :: Word16 -> Builder -showbWord16 = decimal -{-# INLINE showbWord16 #-} - --- | Convert a 'Word32' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbWord32 :: Word32 -> Builder -showbWord32 = decimal -{-# INLINE showbWord32 #-} - --- | Convert a 'Word64' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbWord64 :: Word64 -> Builder -showbWord64 = decimal -{-# INLINE showbWord64 #-} - -instance Show Int where - showbPrec = showbIntPrec - INLINE_INST_FUN(showbPrec) - -instance Show Int8 where - showbPrec = showbInt8Prec - INLINE_INST_FUN(showbPrec) - -instance Show Int16 where - showbPrec = showbInt16Prec - INLINE_INST_FUN(showbPrec) - -instance Show Int32 where - showbPrec = showbInt32Prec - INLINE_INST_FUN(showbPrec) - -instance Show Int64 where - showbPrec = showbInt64Prec - INLINE_INST_FUN(showbPrec) - -instance Show Integer where - showbPrec = showbIntegerPrec - INLINE_INST_FUN(showbPrec) - -instance Show Word where - showb = showbWord - INLINE_INST_FUN(showb) - -instance Show Word8 where - showb = showbWord8 - INLINE_INST_FUN(showb) - -instance Show Word16 where - showb = showbWord16 - INLINE_INST_FUN(showb) - -instance Show Word32 where - showb = showbWord32 - INLINE_INST_FUN(showb) - -instance Show Word64 where - showb = showbWord64 - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Integral+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for integral types.++/Since: 0.3/+-}+module Text.Show.Text.Data.Integral (+ showbIntPrec+ , showbInt8Prec+ , showbInt16Prec+ , showbInt32Prec+ , showbInt64Prec+ , showbIntegerPrec+ , showbIntegralPrec+ , showbIntAtBase+ , showbBin+ , showbHex+ , showbOct+ , showbWord+ , showbWord8+ , showbWord16+ , showbWord32+ , showbWord64+ ) where++import Data.Char (intToDigit)+import Data.Int (Int8, Int16, Int32, Int64)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)+import Data.Text.Lazy.Builder.Int (decimal)+import Data.Word (Word8, Word16, Word32, Word64)++import GHC.Exts (Int(I#))+#if __GLASGOW_HASKELL__ >= 708+import GHC.Exts (isTrue#)+import GHC.Prim (Int#)+#endif+import GHC.Prim ((<#), (>#))++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Utils (s, toString)++#include "inline.h"++-- | Convert an 'Int' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbIntPrec :: Int -> Int -> Builder+showbIntPrec (I# p) n'@(I# n)+ | isTrue (n <# 0#) && isTrue (p ># 6#) = s '(' <> decimal n' <> s ')'+ | otherwise = decimal n'+ where+#if __GLASGOW_HASKELL__ >= 708+ isTrue :: Int# -> Bool+ isTrue b = isTrue# b+#else+ isTrue :: Bool -> Bool+ isTrue = id+#endif++-- | Convert an 'Int8' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbInt8Prec :: Int -> Int8 -> Builder+showbInt8Prec p = showbIntPrec p . fromIntegral+{-# INLINE showbInt8Prec #-}++-- | Convert an 'Int16' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbInt16Prec :: Int -> Int16 -> Builder+showbInt16Prec p = showbIntPrec p . fromIntegral+{-# INLINE showbInt16Prec #-}++-- | Convert an 'Int32' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbInt32Prec :: Int -> Int32 -> Builder+showbInt32Prec p = showbIntPrec p . fromIntegral+{-# INLINE showbInt32Prec #-}++-- | Convert an 'Int64' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbInt64Prec :: Int -> Int64 -> Builder+#if WORD_SIZE_IN_BITS < 64+showbInt64Prec p = showbIntegerPrec p . toInteger+#else+showbInt64Prec p = showbIntPrec p . fromIntegral+#endif+{-# INLINE showbInt64Prec #-}++-- | Convert an 'Integer' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbIntegerPrec :: Int -> Integer -> Builder+showbIntegerPrec p n+ | p > 6 && n < 0 = s '(' <> decimal n <> s ')'+ | otherwise = decimal n+{-# INLINE showbIntegerPrec #-}++-- | Convert an 'Integral' type to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbIntegralPrec :: Integral a => Int -> a -> Builder+showbIntegralPrec p = showbIntegerPrec p . toInteger+{-# INLINE showbIntegralPrec #-}++-- | Shows a /non-negative/ 'Integral' number using the base specified by the+-- first argument, and the character representation specified by the second.+-- +-- /Since: 0.3/+showbIntAtBase :: (Integral a, Show a) => a -> (Int -> Char) -> a -> Builder+showbIntAtBase base toChr n0+ | base <= 1 = error . toString $ "Text.Show.Text.Int.showbIntAtBase: applied to unsupported base" <> showb base+ | n0 < 0 = error . toString $ "Text.Show.Text.Int.showbIntAtBase: applied to negative number " <> showb n0+ | otherwise = showbIt (quotRem n0 base) mempty+ where+ showbIt (n, d) b = seq c $ -- stricter than necessary+ case n of+ 0 -> b'+ _ -> showbIt (quotRem n base) b'+ where+ c :: Char+ c = toChr $ fromIntegral d+ + b' :: Builder+ b' = s c <> b++-- | Show /non-negative/ 'Integral' numbers in base 2.+-- +-- /Since: 0.3/+showbBin :: (Integral a, Show a) => a -> Builder+showbBin = showbIntAtBase 2 intToDigit+{-# INLINE showbBin #-}++-- | Show /non-negative/ 'Integral' numbers in base 16.+-- +-- /Since: 0.3/+showbHex :: (Integral a, Show a) => a -> Builder+showbHex = showbIntAtBase 16 intToDigit+{-# INLINE showbHex #-}++-- | Show /non-negative/ 'Integral' numbers in base 8.+-- +-- /Since: 0.3/+showbOct :: (Integral a, Show a) => a -> Builder+showbOct = showbIntAtBase 8 intToDigit+{-# INLINE showbOct #-}++-- | Convert a 'Word' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbWord :: Word -> Builder+showbWord = decimal+{-# INLINE showbWord #-}++-- | Convert a 'Word8' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbWord8 :: Word8 -> Builder+showbWord8 = decimal+{-# INLINE showbWord8 #-}++-- | Convert a 'Word16' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbWord16 :: Word16 -> Builder+showbWord16 = decimal+{-# INLINE showbWord16 #-}++-- | Convert a 'Word32' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbWord32 :: Word32 -> Builder+showbWord32 = decimal+{-# INLINE showbWord32 #-}++-- | Convert a 'Word64' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbWord64 :: Word64 -> Builder+showbWord64 = decimal+{-# INLINE showbWord64 #-}++instance Show Int where+ showbPrec = showbIntPrec+ INLINE_INST_FUN(showbPrec)++instance Show Int8 where+ showbPrec = showbInt8Prec+ INLINE_INST_FUN(showbPrec)++instance Show Int16 where+ showbPrec = showbInt16Prec+ INLINE_INST_FUN(showbPrec)++instance Show Int32 where+ showbPrec = showbInt32Prec+ INLINE_INST_FUN(showbPrec)++instance Show Int64 where+ showbPrec = showbInt64Prec+ INLINE_INST_FUN(showbPrec)++instance Show Integer where+ showbPrec = showbIntegerPrec+ INLINE_INST_FUN(showbPrec)++instance Show Word where+ showb = showbWord+ INLINE_INST_FUN(showb)++instance Show Word8 where+ showb = showbWord8+ INLINE_INST_FUN(showb)++instance Show Word16 where+ showb = showbWord16+ INLINE_INST_FUN(showb)++instance Show Word32 where+ showb = showbWord32+ INLINE_INST_FUN(showb)++instance Show Word64 where+ showb = showbWord64+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/List.hs view
@@ -1,33 +1,33 @@-{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.List -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Exports 'showbListWith'. --} -module Text.Show.Text.Data.List (showbListWith) where - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec, showbList), - Show1(showbPrec1), showbListWith) -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.Integral () - -#include "inline.h" - -instance Show a => Show [a] where - {-# SPECIALIZE instance Show [String] #-} - {-# SPECIALIZE instance Show [Char] #-} - {-# SPECIALIZE instance Show [Int] #-} - showb = showbList - INLINE_INST_FUN(showb) - -instance Show1 [] where - showbPrec1 = showbPrec +{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.List+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Exports 'showbListWith'.+-}+module Text.Show.Text.Data.List (showbListWith) where++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec, showbList),+ Show1(showbPrec1), showbListWith)+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.Integral ()++#include "inline.h"++instance Show a => Show [a] where+ {-# SPECIALIZE instance Show [String] #-}+ {-# SPECIALIZE instance Show String #-}+ {-# SPECIALIZE instance Show [Int] #-}+ showb = showbList+ INLINE_INST_FUN(showb)++instance Show1 [] where+ showbPrec1 = showbPrec INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Maybe.hs view
@@ -1,38 +1,38 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Maybe -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Maybe' values. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Maybe (showbMaybePrec) where - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) - -#include "inline.h" - --- | Convert a 'Maybe' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbMaybePrec :: Show a => Int -> Maybe a -> Builder -showbMaybePrec = showbPrec -{-# INLINE showbMaybePrec #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Maybe) - -instance Show1 Maybe where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Maybe+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Maybe' values.++/Since: 0.3/+-}+module Text.Show.Text.Data.Maybe (showbMaybePrec) where++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++#include "inline.h"++-- | Convert a 'Maybe' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbMaybePrec :: Show a => Int -> Maybe a -> Builder+showbMaybePrec = showbPrec+{-# INLINE showbMaybePrec #-}++$(deriveShowPragmas defaultInlineShowbPrec ''Maybe)++instance Show1 Maybe where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Monoid.hs view
@@ -1,140 +1,141 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -#if MIN_VERSION_base(4,8,0) -{-# LANGUAGE FlexibleContexts #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Monoid -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Monoid'-related newtypes. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Monoid ( - showbAllPrec - , showbAnyPrec - , showbDualPrec - , showbFirstPrec - , showbLastPrec - , showbProductPrec - , showbSumPrec -#if MIN_VERSION_base(4,8,0) - , showbAltPrec -#endif - ) where - -import Data.Monoid (All, Any, Dual, First, Last, Product, Sum) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1)) -import Text.Show.Text.Data.Bool () -import Text.Show.Text.Data.Maybe () -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) - -#if MIN_VERSION_base(4,8,0) -import Data.Monoid (Alt) - -import Text.Show.Text.TH.Internal (mkShowbPrec) -#endif - -#include "inline.h" - --- | Convert an 'All' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbAllPrec :: Int -> All -> Builder -showbAllPrec = showbPrec -{-# INLINE showbAllPrec #-} - --- | Convert an 'Any' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbAnyPrec :: Int -> Any -> Builder -showbAnyPrec = showbPrec -{-# INLINE showbAnyPrec #-} - --- | Convert a 'Dual' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbDualPrec :: Show a => Int -> Dual a -> Builder -showbDualPrec = showbPrec -{-# INLINE showbDualPrec #-} - --- | Convert a 'First' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbFirstPrec :: Show a => Int -> First a -> Builder -showbFirstPrec = showbPrec -{-# INLINE showbFirstPrec #-} - --- | Convert a 'Last' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbLastPrec :: Show a => Int -> Last a -> Builder -showbLastPrec = showbPrec -{-# INLINE showbLastPrec #-} - --- | Convert a 'Product' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbProductPrec :: Show a => Int -> Product a -> Builder -showbProductPrec = showbPrec -{-# INLINE showbProductPrec #-} - --- | Convert a 'Sum' value to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbSumPrec :: Show a => Int -> Sum a -> Builder -showbSumPrec = showbPrec -{-# INLINE showbSumPrec #-} - -#if MIN_VERSION_base(4,8,0) --- | Convert an 'Alt' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbAltPrec :: Show (f a) => Int -> Alt f a -> Builder -showbAltPrec = showbPrec -{-# INLINE showbAltPrec #-} -#endif - -$(deriveShowPragmas defaultInlineShowbPrec ''All) -$(deriveShowPragmas defaultInlineShowbPrec ''Any) -$(deriveShowPragmas defaultInlineShowbPrec ''Dual) -$(deriveShowPragmas defaultInlineShowbPrec ''First) -$(deriveShowPragmas defaultInlineShowbPrec ''Last) -$(deriveShowPragmas defaultInlineShowbPrec ''Product) -$(deriveShowPragmas defaultInlineShowbPrec ''Sum) -#if MIN_VERSION_base(4,8,0) -instance Show (f a) => Show (Alt f a) where - showbPrec = $(mkShowbPrec ''Alt) - {-# INLINE showbPrec #-} -#endif - -instance Show1 Dual where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show1 First where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show1 Last where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show1 Product where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show1 Sum where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+#if MIN_VERSION_base(4,8,0)+{-# LANGUAGE FlexibleContexts #-}+#endif+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Monoid+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Monoid'-related newtypes.++/Since: 0.3/+-}+module Text.Show.Text.Data.Monoid (+ showbAllPrec+ , showbAnyPrec+ , showbDualPrec+ , showbFirstPrec+ , showbLastPrec+ , showbProductPrec+ , showbSumPrec+#if MIN_VERSION_base(4,8,0)+ , showbAltPrec+#endif+ ) where++import Data.Monoid.Compat (All, Any, Dual, First, Last, Product, Sum)+import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1))+import Text.Show.Text.Data.Bool ()+import Text.Show.Text.Data.Maybe ()+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++#if MIN_VERSION_base(4,8,0)+import Data.Monoid (Alt)+import Text.Show.Text.TH.Internal (mkShowbPrec)+#endif++#include "inline.h"++-- | Convert an 'All' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbAllPrec :: Int -> All -> Builder+showbAllPrec = showbPrec+{-# INLINE showbAllPrec #-}++-- | Convert an 'Any' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbAnyPrec :: Int -> Any -> Builder+showbAnyPrec = showbPrec+{-# INLINE showbAnyPrec #-}++-- | Convert a 'Dual' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbDualPrec :: Show a => Int -> Dual a -> Builder+showbDualPrec = showbPrec+{-# INLINE showbDualPrec #-}++-- | Convert a 'First' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbFirstPrec :: Show a => Int -> First a -> Builder+showbFirstPrec = showbPrec+{-# INLINE showbFirstPrec #-}++-- | Convert a 'Last' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbLastPrec :: Show a => Int -> Last a -> Builder+showbLastPrec = showbPrec+{-# INLINE showbLastPrec #-}++-- | Convert a 'Product' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbProductPrec :: Show a => Int -> Product a -> Builder+showbProductPrec = showbPrec+{-# INLINE showbProductPrec #-}++-- | Convert a 'Sum' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbSumPrec :: Show a => Int -> Sum a -> Builder+showbSumPrec = showbPrec+{-# INLINE showbSumPrec #-}++#if MIN_VERSION_base(4,8,0)+-- | Convert an 'Alt' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.8/+showbAltPrec :: Show (f a) => Int -> Alt f a -> Builder+showbAltPrec = showbPrec+{-# INLINE showbAltPrec #-}+#endif++$(deriveShowPragmas defaultInlineShowbPrec ''All)+$(deriveShowPragmas defaultInlineShowbPrec ''Any)+$(deriveShowPragmas defaultInlineShowbPrec ''Dual)+$(deriveShowPragmas defaultInlineShowbPrec ''First)+$(deriveShowPragmas defaultInlineShowbPrec ''Last)+$(deriveShowPragmas defaultInlineShowbPrec ''Product)+$(deriveShowPragmas defaultInlineShowbPrec ''Sum)++#if MIN_VERSION_base(4,8,0)+-- TODO: Derive with TH once it can detect higher-kinded types properly+instance Show (f a) => Show (Alt f a) where+ showbPrec = $(mkShowbPrec ''Alt)+ {-# INLINE showbPrec #-}+#endif++instance Show1 Dual where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show1 First where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show1 Last where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show1 Product where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show1 Sum where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/OldTypeable.hs view
@@ -1,66 +1,78 @@-{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-warnings-deprecations #-} -{-| -Module: Text.Show.Text.Data.OldTypeable -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @OldTypeable@ module. -This module is only available with @base-4.7@. - -/Since: 0.5/ --} -module Text.Show.Text.Data.OldTypeable (showbTyCon, showbTypeRepPrec) where - -import Data.OldTypeable.Internal (TyCon(TyCon, tyConName), TypeRep(..), - funTc, listTc) -import Data.Text.Lazy.Builder (Builder, fromString) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace) -import Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple) -import Text.Show.Text.Utils ((<>), isTupleString, s) - --- | Convert a 'TyCon' to a 'Builder'. --- This function is only available with @base-4.7@. --- --- /Since: 0.5/ -showbTyCon :: TyCon -> Builder -showbTyCon = fromString . tyConName -{-# INLINE showbTyCon #-} - --- | Convert a 'TypeRep' to a 'Builder' with the given precedence. --- This function is only available with @base-4.7@. --- --- /Since: 0.5/ -showbTypeRepPrec :: Int -> TypeRep -> Builder -showbTypeRepPrec p (TypeRep _ tycon tys) = - case tys of - [] -> showbTyCon tycon - [x] | tycon == listTc -> s '[' <> showb x <> s ']' - [a,r] | tycon == funTc -> showbParen (p > 8) $ - showbPrec 9 a - <> " -> " - <> showbPrec 8 r - xs | isTupleTyCon tycon -> showbTuple xs - | otherwise -> showbParen (p > 9) $ - showbPrec p tycon - <> showbSpace - <> showbArgs showbSpace tys - --- | Does the 'TyCon' represent a tuple type constructor? -isTupleTyCon :: TyCon -> Bool -isTupleTyCon (TyCon _ _ _ str) = isTupleString str -{-# INLINE isTupleTyCon #-} - -instance Show TyCon where - showb = showbTyCon - {-# INLINE showb #-} - -instance Show TypeRep where - showbPrec = showbTypeRepPrec - {-# INLINE showbPrec #-} +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-warnings-deprecations #-}+#endif+{-|+Module: Text.Show.Text.Data.OldTypeable+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @OldTypeable@ module.+This module only exports functions if using @base-4.7@.++/Since: 0.5/+-}+module Text.Show.Text.Data.OldTypeable (+#if !(MIN_VERSION_base(4,7,0)) || MIN_VERSION_base(4,8,0)+ ) where+#else+ showbTyCon+ , showbTypeRepPrec+ ) where++import Data.Monoid.Compat ((<>))+import Data.OldTypeable.Internal (TyCon(TyCon, tyConName), TypeRep(..),+ funTc, listTc)+import Data.Text.Lazy.Builder (Builder, fromString)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace)+import Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple)+import Text.Show.Text.Utils (isTupleString, s)++-- | Convert a 'TyCon' to a 'Builder'.+-- This function is only available with @base-4.7@.+-- +-- /Since: 0.5/+showbTyCon :: TyCon -> Builder+showbTyCon = fromString . tyConName+{-# INLINE showbTyCon #-}++-- | Convert a 'TypeRep' to a 'Builder' with the given precedence.+-- This function is only available with @base-4.7@.+-- +-- /Since: 0.5/+showbTypeRepPrec :: Int -> TypeRep -> Builder+showbTypeRepPrec p (TypeRep _ tycon tys) =+ case tys of+ [] -> showbTyCon tycon+ [x] | tycon == listTc -> s '[' <> showb x <> s ']'+ [a,r] | tycon == funTc -> showbParen (p > 8) $+ showbPrec 9 a+ <> " -> "+ <> showbPrec 8 r+ xs | isTupleTyCon tycon -> showbTuple xs+ | otherwise -> showbParen (p > 9) $+ showbPrec p tycon+ <> showbSpace+ <> showbArgs showbSpace tys++-- | Does the 'TyCon' represent a tuple type constructor?+isTupleTyCon :: TyCon -> Bool+isTupleTyCon (TyCon _ _ _ str) = isTupleString str+{-# INLINE isTupleTyCon #-}++instance Show TyCon where+ showb = showbTyCon+ {-# INLINE showb #-}++instance Show TypeRep where+ showbPrec = showbTypeRepPrec+ {-# INLINE showbPrec #-}+#endif
src/Text/Show/Text/Data/Ord.hs view
@@ -1,62 +1,66 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Ord -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Ordering' and 'Down'. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Ord ( - showbOrdering -#if MIN_VERSION_base(4,6,0) - , showbDownPrec -#endif - ) where - -import Data.Text.Lazy.Builder (Builder) - -import Text.Show.Text.Classes (showb) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb) - -#if MIN_VERSION_base(4,6,0) -import Data.Ord (Down) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (defaultInlineShowbPrec) -#endif - -#include "inline.h" - --- | Convert a 'Ordering' to a 'Builder'. --- --- /Since: 0.3/ -showbOrdering :: Ordering -> Builder -showbOrdering = showb -{-# INLINE showbOrdering #-} - -$(deriveShowPragmas defaultInlineShowb ''Ordering) - -#if MIN_VERSION_base(4,6,0) --- | Convert a 'Down' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.6.0.0@ or later. --- --- /Since: 0.3/ -showbDownPrec :: Show a => Int -> Down a -> Builder -showbDownPrec = showbPrec -{-# INLINE showbDownPrec #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Down) - -instance Show1 Down where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Ord+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Ordering' and 'Down'.++/Since: 0.3/+-}+module Text.Show.Text.Data.Ord (+ showbOrdering+#if MIN_VERSION_base(4,6,0)+ , showbDownPrec+#endif+ ) where++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Show.Text.Classes (showb)+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb)++#if MIN_VERSION_base(4,6,0)+import Data.Ord (Down)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (defaultInlineShowbPrec)+#endif++#include "inline.h"++-- | Convert a 'Ordering' to a 'Builder'.+-- +-- /Since: 0.3/+showbOrdering :: Ordering -> Builder+showbOrdering = showb+{-# INLINE showbOrdering #-}++#if MIN_VERSION_base(4,6,0)+-- | Convert a 'Down' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.6.0.0@ or later.+-- +-- /Since: 0.8/+showbDownPrec :: Show a => Int -> Down a -> Builder+showbDownPrec = showbPrec+{-# INLINE showbDownPrec #-}+#endif++$(deriveShowPragmas defaultInlineShowb ''Ordering)++#if MIN_VERSION_base(4,6,0)+$(deriveShowPragmas defaultInlineShowbPrec ''Down)++instance Show1 Down where+ showbPrec1 = showbPrec+ {-# INLINE showbPrec1 #-}+#endif
src/Text/Show/Text/Data/Proxy.hs view
@@ -1,43 +1,43 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Proxy -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Proxy' values. - -/Since: 0.4/ --} -module Text.Show.Text.Data.Proxy (showbProxy) where - -import Data.Proxy (Proxy(..)) -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (mkShowbPrec) - -#include "inline.h" - --- | Convert a 'Proxy' type to a 'Builder'. --- --- /Since: 0.4/ -showbProxy :: Proxy s -> Builder -showbProxy = showb -{-# INLINE showbProxy #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show (Proxy s) where - showbPrec = $(mkShowbPrec ''Proxy) - INLINE_INST_FUN(showb) - -instance Show1 Proxy where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Proxy+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Proxy' values.++/Since: 0.4/+-}+module Text.Show.Text.Data.Proxy (showbProxy) where++import Data.Proxy (Proxy(..))+import Data.Text.Lazy.Builder (Builder)++import Prelude ()++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (mkShowbPrec)++#include "inline.h"++-- | Convert a 'Proxy' type to a 'Builder'.+-- +-- /Since: 0.4/+showbProxy :: Proxy s -> Builder+showbProxy = showb+{-# INLINE showbProxy #-}++-- TODO: Derive with TH once it can detect phantom types properly+instance Show (Proxy s) where+ showbPrec = $(mkShowbPrec ''Proxy)+ INLINE_INST_FUN(showb)++instance Show1 Proxy where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Ratio.hs view
@@ -1,44 +1,58 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Ratio -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Ratio' values. - -/Since: 0.5/ --} -module Text.Show.Text.Data.Ratio (showbRatioPrec) where - -import Data.Text.Lazy.Builder (Builder) -import Data.Ratio (Ratio, numerator, denominator) - -import GHC.Real (ratioPrec, ratioPrec1) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec), showbParen) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Utils ((<>)) - -#include "inline.h" - --- | Convert a 'Ratio' to a 'Builder' with the given precedence. --- --- /Since: 0.5/ -showbRatioPrec :: (Show a, Integral a) => Int -> Ratio a -> Builder -showbRatioPrec p q = showbParen (p > ratioPrec) $ - showbPrec ratioPrec1 (numerator q) - <> " % " - <> showbPrec ratioPrec1 (denominator q) -{-# INLINE showbRatioPrec #-} - -instance (Show a, Integral a) => Show (Ratio a) where - {-# SPECIALIZE instance Show Rational #-} - showbPrec = showbRatioPrec - INLINE_INST_FUN(showbPrec) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Ratio+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Ratio' values.++/Since: 0.5/+-}+module Text.Show.Text.Data.Ratio (showbRatioPrec) where++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import GHC.Real (Ratio(..), ratioPrec, ratioPrec1)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec), showbParen)+import Text.Show.Text.Data.Integral ()++#include "inline.h"++-- | Convert a 'Ratio' to a 'Builder' with the given precedence.+-- +-- Note that on @base-4.3.0.0@, this function must have a @('Show' a, 'Integral' a)@+-- constraint instead of just a @('Show' a)@ constraint.+-- +-- /Since: 0.5/+showbRatioPrec ::+#if MIN_VERSION_base(4,4,0)+ Show a+#else+ (Show a, Integral a)+#endif+ => Int -> Ratio a -> Builder+showbRatioPrec p (numer :% denom) = showbParen (p > ratioPrec) $+ showbPrec ratioPrec1 numer+ <> " % "+ <> showbPrec ratioPrec1 denom+{-# INLINE showbRatioPrec #-}++instance+#if MIN_VERSION_base(4,4,0)+ Show a+#else+ (Show a, Integral a)+#endif+ => Show (Ratio a) where+ {-# SPECIALIZE instance Show Rational #-}+ showbPrec = showbRatioPrec+ INLINE_INST_FUN(showbPrec)
src/Text/Show/Text/Data/Text.hs view
@@ -1,68 +1,157 @@-{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Text -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Text' types. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Text ( - showbText - , showbTextLazy - , showbBuilder - ) where - -import Data.Text as TS -import Data.Text.Lazy as TL -import Data.Text.Lazy.Builder (Builder, toLazyText) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb)) -import Text.Show.Text.Data.Char (showbString) - -#include "inline.h" - --- | Convert a strict 'TS.Text' into a 'Builder'. --- 'showbText' should not be confused with @fromText@, as 'showbText' escapes --- certain characters (such as double quotes). --- --- /Since: 0.5/ -showbText :: TS.Text -> Builder -showbText = showbString . TS.unpack -{-# INLINE showbText #-} - --- | Convert a lazy 'TL.Text' into a 'Builder'. --- 'showbTextLazy' should not be confused with @fromTextLazy@, as 'showbTextLazy' --- escapes certain characters (such as double quotes). --- --- /Since: 0.3/ -showbTextLazy :: TL.Text -> Builder -showbTextLazy = showbString . TL.unpack -{-# INLINE showbTextLazy #-} - --- | Show a 'Builder' as if it were a 'String' (i.e., escape certain characters, --- such as double quotes). --- --- /Since: 0.5/ -showbBuilder :: Builder -> Builder -showbBuilder = showbTextLazy . toLazyText -{-# INLINE showbBuilder #-} - -instance Show TS.Text where - showb = showbText - INLINE_INST_FUN(showb) - -instance Show TL.Text where - showb = showbTextLazy - INLINE_INST_FUN(showb) - -instance Show Builder where - showb = showbBuilder +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+#if MIN_VERSION_text(0,9,0)+{-# LANGUAGE TemplateHaskell #-}+#endif+{-# OPTIONS_GHC -fno-warn-deprecations #-} -- TODO: Remove this later+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Text+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Text' types.++/Since: 0.3/+-}+module Text.Show.Text.Data.Text (+ showbText+ , showbTextLazy+ , showbBuilder+ , showbI16Prec+ , showbUnicodeException+#if MIN_VERSION_text(1,0,0)+ , showbDecodingPrec+#endif+#if MIN_VERSION_text(1,1,0)+ , showbSizePrec+#endif+ ) where++import Data.Monoid.Compat ((<>))+import qualified Data.Text as TS+import Data.Text.Encoding.Error (UnicodeException(..))+import Data.Text.Foreign (I16)+import qualified Data.Text.Lazy as TL+import Data.Text.Lazy.Builder (Builder, fromString, toLazyText)+import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Data.Char (showbString)+import Text.Show.Text.Data.Integral (showbHex)+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++#if MIN_VERSION_text(1,0,0)+import Data.Text.Encoding (Decoding(..))+import Data.Text.Lazy.Builder (singleton)+import GHC.Show (appPrec)+import Text.Show.Text.Classes (showbParen)+import Text.Show.Text.Data.ByteString (showbByteStringStrict)+#endif++#if MIN_VERSION_text(1,1,0)+import Data.Text.Internal.Fusion.Size (Size)+import Text.Show.Text.TH.Internal (deriveShow)+#endif++#include "inline.h"++-- | Convert a strict 'TS.Text' to a 'Builder'.+-- 'showbText' should not be confused with @fromText@, as 'showbText' escapes+-- certain characters (such as double quotes).+-- +-- /Since: 0.5/+showbText :: TS.Text -> Builder+showbText = showbString . TS.unpack+{-# INLINE showbText #-}++-- | Convert a lazy 'TL.Text' to a 'Builder'.+-- 'showbTextLazy' should not be confused with @fromTextLazy@, as 'showbTextLazy'+-- escapes certain characters (such as double quotes).+-- +-- /Since: 0.3/+showbTextLazy :: TL.Text -> Builder+showbTextLazy = showbString . TL.unpack+{-# INLINE showbTextLazy #-}++-- | Show a 'Builder' as if it were a 'String' (i.e., escape certain characters,+-- such as double quotes).+-- +-- /Since: 0.5/+showbBuilder :: Builder -> Builder+showbBuilder = showbTextLazy . toLazyText+{-# INLINE showbBuilder #-}++-- | Convert an 'I16' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.8/+showbI16Prec :: Int -> I16 -> Builder+showbI16Prec = showbPrec+{-# INLINE showbI16Prec #-}++-- | Convert a 'UnicodeException' to a 'Builder'.+-- +-- /Since: 0.8/+showbUnicodeException :: UnicodeException -> Builder+showbUnicodeException (DecodeError desc (Just w))+ = "Cannot decode byte '\\x" <> showbHex w <> "': " <> fromString desc+showbUnicodeException (DecodeError desc Nothing)+ = "Cannot decode input: " <> fromString desc+showbUnicodeException (EncodeError desc (Just c))+ = "Cannot encode character '\\x" <> showbHex (fromEnum c) <> "': " <> fromString desc+showbUnicodeException (EncodeError desc Nothing)+ = "Cannot encode input: " <> fromString desc++#if MIN_VERSION_text(1,0,0)+-- | Convert a 'Decoding' value to a 'Builder' with the given precedence.+-- This function is only available with @text-1.0.0.0@ or later.+-- +-- /Since: 0.8/+showbDecodingPrec :: Int -> Decoding -> Builder+showbDecodingPrec p (Some t bs _) = showbParen (p > appPrec) $+ fromString "Some " <> showbText t <>+ singleton ' ' <> showbByteStringStrict bs <>+ fromString " _"+{-# INLINE showbDecodingPrec #-}+#endif++#if MIN_VERSION_text(1,1,0)+-- | Convert a 'Size' value to a 'Builder' with the given precedence.+-- This function is only available with @text-1.1.0.0@ or later.+-- +-- /Since: 0.8/+showbSizePrec :: Int -> Size -> Builder+showbSizePrec = showbPrec+{-# INLINE showbSizePrec #-}+#endif++instance Show TS.Text where+ showb = showbText INLINE_INST_FUN(showb)++instance Show TL.Text where+ showb = showbTextLazy+ INLINE_INST_FUN(showb)++instance Show Builder where+ showb = showbBuilder+ INLINE_INST_FUN(showb)++$(deriveShowPragmas defaultInlineShowbPrec ''I16)++instance Show UnicodeException where+ showb = showbUnicodeException+ INLINE_INST_FUN(showb)++#if MIN_VERSION_text(1,0,0)+instance Show Decoding where+ showbPrec = showbDecodingPrec+ INLINE_INST_FUN(showbPrec)+#endif++#if MIN_VERSION_text(1,1,0)+$(deriveShow ''Size)+#endif
src/Text/Show/Text/Data/Tuple.hs view
@@ -1,240 +1,240 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Tuple -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for tuple types. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Tuple ( - showbUnit - , showb2Tuple - , showb3Tuple - , showb4Tuple - , showb5Tuple - , showb6Tuple - , showb7Tuple - , showb8Tuple - , showb9Tuple - , showb10Tuple - , showb11Tuple - , showb12Tuple - , showb13Tuple - , showb14Tuple - , showb15Tuple - ) where - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (deriveShow) - -#include "inline.h" - --- | Converts @()@ into a 'Builder'. --- --- /Since: 0.3/ -showbUnit :: () -> Builder --- showbUnit () = "()" -showbUnit = showb -{-# INLINE showbUnit #-} - --- | Converts a 2-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb2Tuple :: (Show a, Show b) => (a, b) -> Builder -showb2Tuple = showb -{-# INLINE showb2Tuple #-} - --- | Converts a 3-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb3Tuple :: (Show a, Show b, Show c) => (a, b, c) -> Builder -showb3Tuple = showb -{-# INLINE showb3Tuple #-} - --- | Converts a 4-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb4Tuple :: (Show a, Show b, Show c, Show d) => (a, b, c, d) -> Builder -showb4Tuple = showb -{-# INLINE showb4Tuple #-} - --- | Converts a 5-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb5Tuple :: (Show a, Show b, Show c, Show d, Show e) => (a, b, c, d, e) -> Builder -showb5Tuple = showb -{-# INLINE showb5Tuple #-} - --- | Converts a 6-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb6Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f) => (a, b, c, d, e, f) -> Builder -showb6Tuple = showb -{-# INLINE showb6Tuple #-} - --- | Converts a 7-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb7Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g) - => (a, b, c, d, e, f, g) -> Builder -showb7Tuple = showb -{-# INLINE showb7Tuple #-} - --- | Converts an 8-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb8Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) - => (a, b, c, d, e, f, g, h) -> Builder -showb8Tuple = showb -{-# INLINE showb8Tuple #-} - --- | Converts a 9-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb9Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i) - => (a, b, c, d, e, f, g, h, i) -> Builder -showb9Tuple = showb -{-# INLINE showb9Tuple #-} - --- | Converts a 10-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb10Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j) - => (a, b, c, d, e, f, g, h, i, j) -> Builder -showb10Tuple = showb -{-# INLINE showb10Tuple #-} - --- | Converts an 11-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb11Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, - Show g, Show h, Show i, Show j, Show k) - => (a, b, c, d, e, f, g, h, i, j, k) -> Builder -showb11Tuple = showb -{-# INLINE showb11Tuple #-} - --- | Converts a 12-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb12Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, - Show g, Show h, Show i, Show j, Show k, Show l) - => (a, b, c, d, e, f, g, h, i, j, k, l) -> Builder -showb12Tuple = showb -{-# INLINE showb12Tuple #-} - --- | Converts a 13-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb13Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, - Show h, Show i, Show j, Show k, Show l, Show m) - => (a, b, c, d, e, f, g, h, i, j, k, l, m) -> Builder -showb13Tuple = showb -{-# INLINE showb13Tuple #-} - --- | Converts a 14-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb14Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, - Show h, Show i, Show j, Show k, Show l, Show m, Show n) - => (a, b, c, d, e, f, g, h, i, j, k, l, m, n) -> Builder -showb14Tuple = showb -{-# INLINE showb14Tuple #-} - --- | Converts a 15-tuple into a 'Builder'. --- --- /Since: 0.3/ -showb15Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, - Show i, Show j, Show k, Show l, Show m, Show n, Show o) - => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) -> Builder -showb15Tuple = showb -{-# INLINE showb15Tuple #-} - -$(deriveShow ''()) -$(deriveShow ''(,)) -$(deriveShow ''(,,)) -$(deriveShow ''(,,,)) -$(deriveShow ''(,,,,)) -$(deriveShow ''(,,,,,)) -$(deriveShow ''(,,,,,,)) -$(deriveShow ''(,,,,,,,)) -$(deriveShow ''(,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,,,,,)) -$(deriveShow ''(,,,,,,,,,,,,,,)) - -instance Show a => Show1 ((,) a) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b) => Show1 ((,,) a b) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c) => Show1 ((,,,) a b c) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d) => Show1 ((,,,,) a b c d) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e) => Show1 ((,,,,,) a b c d e) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show1 ((,,,,,,) a b c d e f) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g) => Show1 ((,,,,,,,) a b c d e f g) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) => - Show1 ((,,,,,,,,) a b c d e f g h) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i) => - Show1 ((,,,,,,,,,) a b c d e f g h i) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j) => - Show1 ((,,,,,,,,,,) a b c d e f g h i j) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k) => - Show1 ((,,,,,,,,,,,) a b c d e f g h i j k) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l) => - Show1 ((,,,,,,,,,,,,) a b c d e f g h i j k l) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m) => - Show1 ((,,,,,,,,,,,,,) a b c d e f g h i j k l m) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m, Show n) => - Show1 ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Tuple+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for tuple types.++/Since: 0.3/+-}+module Text.Show.Text.Data.Tuple (+ showbUnit+ , showb2Tuple+ , showb3Tuple+ , showb4Tuple+ , showb5Tuple+ , showb6Tuple+ , showb7Tuple+ , showb8Tuple+ , showb9Tuple+ , showb10Tuple+ , showb11Tuple+ , showb12Tuple+ , showb13Tuple+ , showb14Tuple+ , showb15Tuple+ ) where++import Data.Text.Lazy.Builder (Builder)++import Prelude ()++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (deriveShow)++#include "inline.h"++-- | Converts @()@ into a 'Builder'.+-- +-- /Since: 0.3/+showbUnit :: () -> Builder+-- showbUnit () = "()"+showbUnit = showb+{-# INLINE showbUnit #-}++-- | Converts a 2-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb2Tuple :: (Show a, Show b) => (a, b) -> Builder+showb2Tuple = showb+{-# INLINE showb2Tuple #-}++-- | Converts a 3-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb3Tuple :: (Show a, Show b, Show c) => (a, b, c) -> Builder+showb3Tuple = showb+{-# INLINE showb3Tuple #-}++-- | Converts a 4-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb4Tuple :: (Show a, Show b, Show c, Show d) => (a, b, c, d) -> Builder+showb4Tuple = showb+{-# INLINE showb4Tuple #-}++-- | Converts a 5-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb5Tuple :: (Show a, Show b, Show c, Show d, Show e) => (a, b, c, d, e) -> Builder+showb5Tuple = showb+{-# INLINE showb5Tuple #-}++-- | Converts a 6-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb6Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f) => (a, b, c, d, e, f) -> Builder+showb6Tuple = showb+{-# INLINE showb6Tuple #-}++-- | Converts a 7-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb7Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g)+ => (a, b, c, d, e, f, g) -> Builder+showb7Tuple = showb+{-# INLINE showb7Tuple #-}++-- | Converts an 8-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb8Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h)+ => (a, b, c, d, e, f, g, h) -> Builder+showb8Tuple = showb+{-# INLINE showb8Tuple #-}++-- | Converts a 9-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb9Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i)+ => (a, b, c, d, e, f, g, h, i) -> Builder+showb9Tuple = showb+{-# INLINE showb9Tuple #-}++-- | Converts a 10-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb10Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j)+ => (a, b, c, d, e, f, g, h, i, j) -> Builder+showb10Tuple = showb+{-# INLINE showb10Tuple #-}++-- | Converts an 11-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb11Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f,+ Show g, Show h, Show i, Show j, Show k)+ => (a, b, c, d, e, f, g, h, i, j, k) -> Builder+showb11Tuple = showb+{-# INLINE showb11Tuple #-}++-- | Converts a 12-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb12Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f,+ Show g, Show h, Show i, Show j, Show k, Show l)+ => (a, b, c, d, e, f, g, h, i, j, k, l) -> Builder+showb12Tuple = showb+{-# INLINE showb12Tuple #-}++-- | Converts a 13-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb13Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g,+ Show h, Show i, Show j, Show k, Show l, Show m)+ => (a, b, c, d, e, f, g, h, i, j, k, l, m) -> Builder+showb13Tuple = showb+{-# INLINE showb13Tuple #-}++-- | Converts a 14-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb14Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g,+ Show h, Show i, Show j, Show k, Show l, Show m, Show n)+ => (a, b, c, d, e, f, g, h, i, j, k, l, m, n) -> Builder+showb14Tuple = showb+{-# INLINE showb14Tuple #-}++-- | Converts a 15-tuple into a 'Builder'.+-- +-- /Since: 0.3/+showb15Tuple :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h,+ Show i, Show j, Show k, Show l, Show m, Show n, Show o)+ => (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) -> Builder+showb15Tuple = showb+{-# INLINE showb15Tuple #-}++$(deriveShow ''())+$(deriveShow ''(,))+$(deriveShow ''(,,))+$(deriveShow ''(,,,))+$(deriveShow ''(,,,,))+$(deriveShow ''(,,,,,))+$(deriveShow ''(,,,,,,))+$(deriveShow ''(,,,,,,,))+$(deriveShow ''(,,,,,,,,))+$(deriveShow ''(,,,,,,,,,))+$(deriveShow ''(,,,,,,,,,,))+$(deriveShow ''(,,,,,,,,,,,))+$(deriveShow ''(,,,,,,,,,,,,))+$(deriveShow ''(,,,,,,,,,,,,,))+$(deriveShow ''(,,,,,,,,,,,,,,))++instance Show a => Show1 ((,) a) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b) => Show1 ((,,) a b) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c) => Show1 ((,,,) a b c) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d) => Show1 ((,,,,) a b c d) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e) => Show1 ((,,,,,) a b c d e) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show1 ((,,,,,,) a b c d e f) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g) => Show1 ((,,,,,,,) a b c d e f g) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>+ Show1 ((,,,,,,,,) a b c d e f g h) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i) =>+ Show1 ((,,,,,,,,,) a b c d e f g h i) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j) =>+ Show1 ((,,,,,,,,,,) a b c d e f g h i j) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k) =>+ Show1 ((,,,,,,,,,,,) a b c d e f g h i j k) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l) =>+ Show1 ((,,,,,,,,,,,,) a b c d e f g h i j k l) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m) =>+ Show1 ((,,,,,,,,,,,,,) a b c d e f g h i j k l m) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m, Show n) =>+ Show1 ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Data/Type/Coercion.hs view
@@ -1,42 +1,52 @@-{-# LANGUAGE GADTs #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Type.Coercion -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for representational equality. -This module is only available with @base-4.7.0.0@ or later. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Type.Coercion (showbCoercion) where - -import Data.Text.Lazy.Builder (Builder) -import Data.Type.Coercion (Coercion(..)) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (mkShowbPrec) - --- | Convert a representational equality value to a 'Builder'. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.3/ -showbCoercion :: Coercion a b -> Builder -showbCoercion = showb -{-# INLINE showbCoercion #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show (Coercion a b) where - showbPrec = $(mkShowbPrec ''Coercion) - {-# INLINE showb #-} - -instance Show1 (Coercion a) where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,7,0)+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.Data.Type.Coercion+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for representational equality.+This module only exports functions if using @base-4.7.0.0@ or later.++/Since: 0.3/+-}+module Text.Show.Text.Data.Type.Coercion (+#if !(MIN_VERSION_base(4,7,0))+ ) where+#else+ showbCoercion+ ) where++import Data.Text.Lazy.Builder (Builder)+import Data.Type.Coercion (Coercion(..))++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (mkShowbPrec)++-- | Convert a representational equality value to a 'Builder'.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.3/+showbCoercion :: Coercion a b -> Builder+showbCoercion = showb+{-# INLINE showbCoercion #-}++-- TODO: Derive with TH once it can detect phantom types properly+instance Show (Coercion a b) where+ showbPrec = $(mkShowbPrec ''Coercion)+ {-# INLINE showb #-}++instance Show1 (Coercion a) where+ showbPrec1 = showbPrec+ {-# INLINE showbPrec1 #-}+#endif
src/Text/Show/Text/Data/Type/Equality.hs view
@@ -1,43 +1,53 @@-{-# LANGUAGE GADTs #-} -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE TypeOperators #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Type.Equality -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for propositional equality. -This module is only available with @base-4.7.0.0@ or later. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Type.Equality (showbPropEquality) where - -import Data.Text.Lazy.Builder (Builder) -import Data.Type.Equality ((:~:)(..)) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.TH.Internal (mkShowbPrec) - --- | Convert a propositional equality value to a 'Builder'. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.3/ -showbPropEquality :: (a :~: b) -> Builder -showbPropEquality = showb -{-# INLINE showbPropEquality #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show (a :~: b) where - showbPrec = $(mkShowbPrec ''(:~:)) - {-# INLINE showb #-} - -instance Show1 ((:~:) a) where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,7,0)+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.Data.Type.Equality+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for propositional equality.+This module only exports functions if using @base-4.7.0.0@ or later.++/Since: 0.3/+-}+module Text.Show.Text.Data.Type.Equality (+#if !(MIN_VERSION_base(4,7,0))+ ) where+#else+ showbPropEquality+ ) where++import Data.Text.Lazy.Builder (Builder)+import Data.Type.Equality ((:~:)(..))++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.TH.Internal (mkShowbPrec)++-- | Convert a propositional equality value to a 'Builder'.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.3/+showbPropEquality :: (a :~: b) -> Builder+showbPropEquality = showb+{-# INLINE showbPropEquality #-}++-- TODO: Derive with TH once it can detect phantom types properly+instance Show (a :~: b) where+ showbPrec = $(mkShowbPrec ''(:~:))+ {-# INLINE showb #-}++instance Show1 ((:~:) a) where+ showbPrec1 = showbPrec+ {-# INLINE showbPrec1 #-}+#endif
src/Text/Show/Text/Data/Typeable.hs view
@@ -1,104 +1,105 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Typeable -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @Typeable@ module. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Typeable (showbTyCon, showbTypeRepPrec) where - -import Data.Text.Lazy.Builder (Builder, fromString) -import Data.Typeable (TypeRep, typeRepArgs, typeRepTyCon) -#if MIN_VERSION_base(4,4,0) -import Data.Typeable.Internal (TyCon(..), funTc, listTc) -# if MIN_VERSION_base(4,8,0) -import Data.Typeable.Internal (typeRepKinds) -# endif -#else -import Data.Typeable (TyCon, mkTyCon, tyConString, typeOf) -#endif - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace) -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple) -import Text.Show.Text.Utils ((<>), isTupleString, s) - -#include "inline.h" - --- | Convert a 'TypeRep' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbTypeRepPrec :: Int -> TypeRep -> Builder -showbTypeRepPrec p tyrep = - case tys of - [] -> showbTyCon tycon - [x] | tycon == listTc -> s '[' <> showb x <> s ']' - [a,r] | tycon == funTc -> showbParen (p > 8) $ - showbPrec 9 a - <> " -> " - <> showbPrec 8 r - xs | isTupleTyCon tycon -> showbTuple xs - | otherwise -> showbParen (p > 9) $ - showbPrec p tycon - <> showbSpace - <> showbArgs showbSpace -#if MIN_VERSION_base(4,8,0) - (kinds ++ tys) -#else - tys -#endif - where - tycon = typeRepTyCon tyrep - tys = typeRepArgs tyrep -#if MIN_VERSION_base(4,8,0) - kinds = typeRepKinds tyrep -#endif - -#if !(MIN_VERSION_base(4,4,0)) --- | The list 'TyCon'. -listTc :: TyCon -listTc = typeRepTyCon $ typeOf [()] -{-# INLINE listTc #-} - --- | The function (@->@) 'TyCon'. -funTc :: TyCon -funTc = mkTyCon "->" -#endif - --- | Does the 'TyCon' represent a tuple type constructor? -isTupleTyCon :: TyCon -> Bool -isTupleTyCon = isTupleString . tyConString -{-# INLINE isTupleTyCon #-} - --- | Convert a 'TyCon' to a 'Builder'. --- --- /Since: 0.3/ -showbTyCon :: TyCon -> Builder -showbTyCon = fromString . tyConString -{-# INLINE showbTyCon #-} - -#if MIN_VERSION_base(4,4,0) --- | Identical to 'tyConName'. Defined to avoid using excessive amounts of pragmas --- with base-4.3 and earlier, which use 'tyConString'. -tyConString :: TyCon -> String -tyConString = tyConName -{-# INLINE tyConString #-} -#endif - -instance Show TypeRep where - showbPrec = showbTypeRepPrec - INLINE_INST_FUN(showbPrec) - -instance Show TyCon where - showb = showbTyCon - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Typeable+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @Typeable@ module.++/Since: 0.3/+-}+module Text.Show.Text.Data.Typeable (showbTyCon, showbTypeRepPrec) where++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder, fromString)+import Data.Typeable (TypeRep, typeRepArgs, typeRepTyCon)+#if MIN_VERSION_base(4,4,0)+import Data.Typeable.Internal (TyCon(..), funTc, listTc)+# if MIN_VERSION_base(4,8,0)+import Data.Typeable.Internal (typeRepKinds)+# endif+#else+import Data.Typeable (TyCon, mkTyCon, tyConString, typeOf)+#endif++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, showbSpace)+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple)+import Text.Show.Text.Utils (isTupleString, s)++#include "inline.h"++-- | Convert a 'TypeRep' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbTypeRepPrec :: Int -> TypeRep -> Builder+showbTypeRepPrec p tyrep =+ case tys of+ [] -> showbTyCon tycon+ [x] | tycon == listTc -> s '[' <> showb x <> s ']'+ [a,r] | tycon == funTc -> showbParen (p > 8) $+ showbPrec 9 a+ <> " -> "+ <> showbPrec 8 r+ xs | isTupleTyCon tycon -> showbTuple xs+ | otherwise -> showbParen (p > 9) $+ showbPrec p tycon+ <> showbSpace+ <> showbArgs showbSpace+#if MIN_VERSION_base(4,8,0)+ (kinds ++ tys)+#else+ tys+#endif+ where+ tycon = typeRepTyCon tyrep+ tys = typeRepArgs tyrep+#if MIN_VERSION_base(4,8,0)+ kinds = typeRepKinds tyrep+#endif++#if !(MIN_VERSION_base(4,4,0))+-- | The list 'TyCon'.+listTc :: TyCon+listTc = typeRepTyCon $ typeOf [()]+{-# INLINE listTc #-}++-- | The function (@->@) 'TyCon'.+funTc :: TyCon+funTc = mkTyCon "->"+#endif++-- | Does the 'TyCon' represent a tuple type constructor?+isTupleTyCon :: TyCon -> Bool+isTupleTyCon = isTupleString . tyConString+{-# INLINE isTupleTyCon #-}++-- | Convert a 'TyCon' to a 'Builder'.+-- +-- /Since: 0.3/+showbTyCon :: TyCon -> Builder+showbTyCon = fromString . tyConString+{-# INLINE showbTyCon #-}++#if MIN_VERSION_base(4,4,0)+-- | Identical to 'tyConName'. Defined to avoid using excessive amounts of pragmas+-- with base-4.3 and earlier, which use 'tyConString'.+tyConString :: TyCon -> String+tyConString = tyConName+{-# INLINE tyConString #-}+#endif++instance Show TypeRep where+ showbPrec = showbTypeRepPrec+ INLINE_INST_FUN(showbPrec)++instance Show TyCon where+ showb = showbTyCon+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Data/Typeable/Utils.hs view
@@ -1,34 +1,32 @@-{-# LANGUAGE CPP #-} -{-| -Module: Text.Show.Text.Data.Typeable.Utils -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Utility functions for showing data types in the @Typeable@ (or @OldTypeable@) module. --} -module Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple) where - -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -#endif -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec)) -import Text.Show.Text.Utils ((<>), s) - --- | Helper function for showing a list of arguments, each separated by the given --- 'Builder'. -showbArgs :: Show a => Builder -> [a] -> Builder -showbArgs _ [] = mempty -showbArgs _ [a] = showbPrec 10 a -showbArgs sep (a:as) = showbPrec 10 a <> sep <> showbArgs sep as - --- | Helper function for showing a list of 'Show' instances in a tuple. -showbTuple :: Show a => [a] -> Builder -showbTuple args = s '(' <> showbArgs (s ',') args <> s ')' -{-# INLINE showbTuple #-} +{-|+Module: Text.Show.Text.Data.Typeable.Utils+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Utility functions for showing data types in the @Typeable@ (or @OldTypeable@) module.+-}+module Text.Show.Text.Data.Typeable.Utils (showbArgs, showbTuple) where++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import Prelude ()+import Prelude.Compat hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec))+import Text.Show.Text.Utils (s)++-- | Helper function for showing a list of arguments, each separated by the given+-- 'Builder'.+showbArgs :: Show a => Builder -> [a] -> Builder+showbArgs _ [] = mempty+showbArgs _ [a] = showbPrec 10 a+showbArgs sep (a:as) = showbPrec 10 a <> sep <> showbArgs sep as++-- | Helper function for showing a list of 'Show' instances in a tuple.+showbTuple :: Show a => [a] -> Builder+showbTuple args = s '(' <> showbArgs (s ',') args <> s ')'+{-# INLINE showbTuple #-}
src/Text/Show/Text/Data/Version.hs view
@@ -1,53 +1,53 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Version -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for 'Version'. - -/Since: 0.3/ --} -module Text.Show.Text.Data.Version ( - showbVersionPrec - , showbVersionConcrete - ) where - -import Data.List (intersperse) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mconcat) -#endif -import Data.Text.Lazy.Builder (Builder, fromString) -import Data.Version (Version(..)) - -import Text.Show.Text.Classes (showb, showbPrec) -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Data.List () -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) -import Text.Show.Text.Utils ((<>), s) - --- | Convert a 'Version' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbVersionPrec :: Int -> Version -> Builder -showbVersionPrec = showbPrec -{-# INLINE showbVersionPrec #-} - --- | Provides one possible concrete representation for 'Version'. For --- a version with 'versionBranch' @= [1,2,3]@ and 'versionTags' --- @= [\"tag1\",\"tag2\"]@, the output will be @1.2.3-tag1-tag2@. --- --- /Since: 0.3/ -showbVersionConcrete :: Version -> Builder -showbVersionConcrete (Version branch tags) - = mconcat (intersperse (s '.') $ map showb branch) <> - mconcat (map ((s '-' <>) . fromString) tags) -{-# INLINE showbVersionConcrete #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Version) +{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Version+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for 'Version'.++/Since: 0.3/+-}+module Text.Show.Text.Data.Version (+ showbVersionPrec+ , showbVersionConcrete+ ) where++import Data.List (intersperse)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder, fromString)+import Data.Version (Version(..))++import Prelude ()+import Prelude.Compat++import Text.Show.Text.Classes (showb, showbPrec)+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Data.List ()+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)+import Text.Show.Text.Utils (s)++-- | Convert a 'Version' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbVersionPrec :: Int -> Version -> Builder+showbVersionPrec = showbPrec+{-# INLINE showbVersionPrec #-}++-- | Provides one possible concrete representation for 'Version'. For+-- a version with 'versionBranch' @= [1,2,3]@ and 'versionTags' +-- @= [\"tag1\",\"tag2\"]@, the output will be @1.2.3-tag1-tag2@.+-- +-- /Since: 0.3/+showbVersionConcrete :: Version -> Builder+showbVersionConcrete (Version branch tags)+ = mconcat (intersperse (s '.') $ map showb branch) <>+ mconcat (map ((s '-' <>) . fromString) tags)+{-# INLINE showbVersionConcrete #-}++$(deriveShowPragmas defaultInlineShowbPrec ''Version)
src/Text/Show/Text/Data/Void.hs view
@@ -1,36 +1,36 @@-{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Data.Void -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Void' values. - -/Since: 0.5/ --} -module Text.Show.Text.Data.Void (showbVoid) where - -import Data.Text.Lazy.Builder (Builder) -import Data.Void (Void, absurd) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb)) - -#include "inline.h" - --- | Since 'Void' values logically don't exist, attempting to convert one to a --- 'Builder' will never terminate. --- --- /Since: 0.5/ -showbVoid :: Void -> Builder -showbVoid = absurd -{-# INLINE showbVoid #-} - -instance Show Void where - showb = showbVoid - INLINE_INST_FUN(showb) +{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Data.Void+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Void' values.++/Since: 0.5/+-}+module Text.Show.Text.Data.Void (showbVoid) where++import Data.Text.Lazy.Builder (Builder)+import Data.Void (Void, absurd)++import Prelude ()++import Text.Show.Text.Classes (Show(showb))++#include "inline.h"++-- | Since 'Void' values logically don't exist, attempting to convert one to a+-- 'Builder' will never terminate.+-- +-- /Since: 0.5/+showbVoid :: Void -> Builder+showbVoid = absurd+{-# INLINE showbVoid #-}++instance Show Void where+ showb = showbVoid+ INLINE_INST_FUN(showb)
src/Text/Show/Text/Debug/Trace.hs view
@@ -1,368 +1,368 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE ForeignFunctionInterface #-} -{-# LANGUAGE OverloadedStrings #-} -{-| -Module: Text.Show.Text.Debug.Trace -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Functions for tracing and monitoring execution. - -These can be useful for investigating bugs or performance problems. -They should /not/ be used in production code. - -If you do not wish to require 'Show' instances for your @trace@ functions, -the "Text.Show.Text.Debug.Trace.TH" and "Text.Show.Text.Debug.Trace.Generic" modules -exist to convert the input to a debug message using Template Haskell or generics, -respectively. - -/Since: 0.5/ --} -module Text.Show.Text.Debug.Trace ( - -- * Tracing - -- $tracing - trace - , traceLazy - , traceId - , traceIdLazy - , traceShow - , traceShowId -#if MIN_VERSION_base(4,5,0) - , traceStack - , traceStackLazy -#endif - , traceIO - , traceIOLazy - , traceM - , traceMLazy - , traceShowM - -#if MIN_VERSION_base(4,5,0) - -- * Eventlog tracing - -- $eventlog_tracing - , traceEvent - , traceEventLazy - , traceEventIO - , traceEventIOLazy -#endif -#if MIN_VERSION_base(4,7,0) - -- * Execution phase markers - -- $markers - , traceMarker - , traceMarkerLazy - , traceMarkerIO - , traceMarkerIOLazy -#endif - ) where - -import Control.Monad (when) - -import qualified Data.ByteString as BS (null, partition) -import Data.ByteString (ByteString, useAsCString) -import Data.ByteString.Internal (c2w) -import qualified Data.Text as TS (Text) -import Data.Text.Encoding (encodeUtf8) -import qualified Data.Text.Lazy as TL (Text) -import Data.Text.Lazy (toStrict) - -import Foreign.C.String (CString) - -#if MIN_VERSION_base(4,5,0) -import qualified Data.ByteString.Char8 as BS (pack) -import qualified Data.Text as TS (unpack) -import qualified Data.Text.Lazy as TL (unpack) - -import qualified Debug.Trace as S - -import GHC.Stack (currentCallStack, renderStack) -#endif - -import Prelude hiding (Show(show)) - -import System.IO.Unsafe (unsafePerformIO) - -import Text.Show.Text.Classes (Show, show) -import Text.Show.Text.Instances () - --- $tracing --- --- The 'trace', 'traceShow' and 'traceIO' functions print messages to an output --- stream. They are intended for \"printf debugging\", that is: tracing the flow --- of execution and printing interesting values. --- --- All these functions evaluate the message completely before printing --- it; so if the message is not fully defined, none of it will be --- printed. --- --- The usual output stream is 'System.IO.stderr'. For Windows GUI applications --- (that have no stderr) the output is directed to the Windows debug console. --- Some implementations of these functions may decorate the @Text@ that\'s --- output to indicate that you\'re tracing. - --- | The 'traceIO' function outputs the trace message from the IO monad. --- This sequences the output with respect to other IO actions. --- --- /Since: 0.5/ -traceIO :: TS.Text -> IO () -traceIO = traceIOByteString . encodeUtf8 - --- | Like 'traceIO' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceIOLazy :: TL.Text -> IO () -traceIOLazy = traceIO . toStrict - -traceIOByteString :: ByteString -> IO () -traceIOByteString msg = useAsCString "%s\n" $ \cfmt -> do - -- NB: debugBelch can't deal with null bytes, so filter them - -- out so we don't accidentally truncate the message. See Trac #9395 - let (nulls, msg') = BS.partition (== c2w '\0') msg - useAsCString msg' $ \cmsg -> - debugBelch cfmt cmsg - when (not (BS.null nulls)) $ - useAsCString "WARNING: previous trace message had null bytes" $ \cmsg -> - debugBelch cfmt cmsg - --- don't use debugBelch() directly, because we cannot call varargs functions --- using the FFI. -foreign import ccall unsafe "HsBase.h debugBelch2" - debugBelch :: CString -> CString -> IO () - -{-| -The 'trace' function outputs the trace message given as its first argument, -before returning the second argument as its result. - -For example, this returns the value of @f x@ but first outputs the message. - -> trace ("calling f with x = " <> show x) (f x) - -The 'trace' function should /only/ be used for debugging, or for monitoring -execution. The function is not referentially transparent: its type indicates -that it is a pure function but it has the side effect of outputting the -trace message. - -/Since: 0.5/ --} -trace :: TS.Text -> a -> a -trace = traceByteString . encodeUtf8 - --- | Like 'trace' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceLazy :: TL.Text -> a -> a -traceLazy = trace . toStrict - -{-# NOINLINE traceByteString #-} -traceByteString :: ByteString -> a -> a -traceByteString bs expr = unsafePerformIO $ do - traceIOByteString bs - return expr - --- | Like 'trace' but returns the message instead of a third value. --- --- /Since: 0.5/ -traceId :: TS.Text -> TS.Text -traceId a = trace a a - --- | Like 'traceId' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceIdLazy :: TL.Text -> TL.Text -traceIdLazy a = traceLazy a a - -{-| -Like 'trace', but uses 'show' on the argument to convert it to a 'TS.Text'. - -This makes it convenient for printing the values of interesting variables or -expressions inside a function. For example here we print the value of the -variables @x@ and @z@: - -> f x y = -> traceShow (x, z) $ result -> where -> z = ... -> ... - -/Since: 0.5/ --} -traceShow :: Show a => a -> b -> b -traceShow = trace . show - --- | Like 'traceShow' but returns the shown value instead of a third value. --- --- /Since: 0.5/ -traceShowId :: Show a => a -> a -traceShowId a = trace (show a) a - -{-| -Like 'trace' but returning unit in an arbitrary monad. Allows for convenient -use in do-notation. Note that the application of 'trace' is not an action in the -monad, as 'traceIO' is in the 'IO' monad. - -> ... = do -> x <- ... -> traceM $ "x: " <> show x -> y <- ... -> traceM $ "y: " <> show y - -/Since: 0.5/ --} -traceM :: Monad m => TS.Text -> m () -traceM text = trace text $ return () - --- | Like 'traceM' but accepts a lazy 'TL.Text' argument. -traceMLazy :: Monad m => TL.Text -> m () -traceMLazy text = traceLazy text $ return () - -{-| -Like 'traceM', but uses 'show' on the argument to convert it to a 'TS.Text'. - -> ... = do -> x <- ... -> traceMShow $ x -> y <- ... -> traceMShow $ x + y - -/Since: 0.5/ --} -traceShowM :: (Show a, Monad m) => a -> m () -traceShowM = traceM . show - -#if MIN_VERSION_base(4,5,0) --- | Like 'trace' but additionally prints a call stack if one is --- available. --- --- In the current GHC implementation, the call stack is only --- availble if the program was compiled with @-prof@; otherwise --- 'traceStack' behaves exactly like 'trace'. Entries in the call --- stack correspond to @SCC@ annotations, so it is a good idea to use --- @-fprof-auto@ or @-fprof-auto-calls@ to add SCC annotations automatically. --- --- /Since: 0.5/ -traceStack :: TS.Text -> a -> a -traceStack = traceStackByteString . encodeUtf8 - --- | Like 'traceStack' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceStackLazy :: TL.Text -> a -> a -traceStackLazy = traceStack . toStrict - -traceStackByteString :: ByteString -> a -> a -traceStackByteString bs expr = unsafePerformIO $ do - traceIOByteString bs - stack <- currentCallStack - when (not (null stack)) . traceIOByteString . BS.pack $ renderStack stack - return expr - --- $eventlog_tracing --- --- Eventlog tracing is a performance profiling system. These functions emit --- extra events into the eventlog. In combination with eventlog profiling --- tools these functions can be used for monitoring execution and --- investigating performance problems. --- --- Currently only GHC provides eventlog profiling, see the GHC user guide for --- details on how to use it. These function exists for other Haskell --- implementations but no events are emitted. Note that the @Text@ message is --- always evaluated, whether or not profiling is available or enabled. - --- | The 'traceEvent' function behaves like 'trace' with the difference that --- the message is emitted to the eventlog, if eventlog profiling is available --- and enabled at runtime. --- --- It is suitable for use in pure code. In an IO context use 'traceEventIO' --- instead. --- --- Note that when using GHC's SMP runtime, it is possible (but rare) to get --- duplicate events emitted if two CPUs simultaneously evaluate the same thunk --- that uses 'traceEvent'. --- --- /Since: 0.5/ -traceEvent :: TS.Text -> a -> a -traceEvent = S.traceEvent . TS.unpack - --- | Like 'traceEvent' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceEventLazy :: TL.Text -> a -> a -traceEventLazy = S.traceEvent . TL.unpack - --- | The 'traceEventIO' function emits a message to the eventlog, if eventlog --- profiling is available and enabled at runtime. --- --- Compared to 'traceEvent', 'traceEventIO' sequences the event with respect to --- other IO actions. --- --- /Since: 0.5/ -traceEventIO :: TS.Text -> IO () -traceEventIO = S.traceEventIO . TS.unpack - --- | Like 'traceEventIO' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceEventIOLazy :: TL.Text -> IO () -traceEventIOLazy = S.traceEventIO . TL.unpack -#endif - -#if MIN_VERSION_base(4,7,0) --- $markers --- --- When looking at a profile for the execution of a program we often want to --- be able to mark certain points or phases in the execution and see that --- visually in the profile. - --- For example, a program might have several distinct phases with different --- performance or resource behaviour in each phase. To properly interpret the --- profile graph we really want to see when each phase starts and ends. --- --- Markers let us do this: we can annotate the program to emit a marker at --- an appropriate point during execution and then see that in a profile. --- --- Currently this feature is only supported in GHC by the eventlog tracing --- system, but in future it may also be supported by the heap profiling or --- other profiling tools. These function exists for other Haskell --- implementations but they have no effect. Note that the @Text@ message is --- always evaluated, whether or not profiling is available or enabled. - --- | The 'traceMarker' function emits a marker to the eventlog, if eventlog --- profiling is available and enabled at runtime. The 'TS.Text' is the name of --- the marker. The name is just used in the profiling tools to help you keep --- clear which marker is which. --- --- This function is suitable for use in pure code. In an IO context use --- 'traceMarkerIO' instead. --- --- Note that when using GHC's SMP runtime, it is possible (but rare) to get --- duplicate events emitted if two CPUs simultaneously evaluate the same thunk --- that uses 'traceMarker'. --- --- /Since: 0.5/ -traceMarker :: TS.Text -> a -> a -traceMarker msg = S.traceMarker $ TS.unpack msg - --- | Like 'traceMarker' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceMarkerLazy :: TL.Text -> a -> a -traceMarkerLazy msg = S.traceMarker $ TL.unpack msg - --- | The 'traceMarkerIO' function emits a marker to the eventlog, if eventlog --- profiling is available and enabled at runtime. --- --- Compared to 'traceMarker', 'traceMarkerIO' sequences the event with respect to --- other IO actions. --- --- /Since: 0.5/ -traceMarkerIO :: TS.Text -> IO () -traceMarkerIO = S.traceMarkerIO . TS.unpack - --- | Like 'traceMarkerIO' but accepts a lazy 'TL.Text' argument. --- --- /Since: 0.5/ -traceMarkerIOLazy :: TL.Text -> IO () -traceMarkerIOLazy = S.traceMarkerIO . TL.unpack -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE OverloadedStrings #-}+{-|+Module: Text.Show.Text.Debug.Trace+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Functions for tracing and monitoring execution.++These can be useful for investigating bugs or performance problems.+They should /not/ be used in production code.++If you do not wish to require 'Show' instances for your @trace@ functions,+the "Text.Show.Text.Debug.Trace.TH" and "Text.Show.Text.Debug.Trace.Generic" modules+exist to convert the input to a debug message using Template Haskell or generics,+respectively.++/Since: 0.5/+-}+module Text.Show.Text.Debug.Trace (+ -- * Tracing+ -- $tracing+ trace+ , traceLazy+ , traceId+ , traceIdLazy+ , traceShow+ , traceShowId+#if MIN_VERSION_base(4,5,0)+ , traceStack+ , traceStackLazy+#endif+ , traceIO+ , traceIOLazy+ , traceM+ , traceMLazy+ , traceShowM+ +#if MIN_VERSION_base(4,5,0)+ -- * Eventlog tracing+ -- $eventlog_tracing+ , traceEvent+ , traceEventLazy+ , traceEventIO+ , traceEventIOLazy+#endif+#if MIN_VERSION_base(4,7,0)+ -- * Execution phase markers+ -- $markers+ , traceMarker+ , traceMarkerLazy+ , traceMarkerIO+ , traceMarkerIOLazy+#endif+ ) where++import Control.Monad (unless)++import qualified Data.ByteString as BS (null, partition)+import Data.ByteString (ByteString, useAsCString)+import Data.ByteString.Internal (c2w)+import qualified Data.Text as TS (Text)+import Data.Text.Encoding (encodeUtf8)+import qualified Data.Text.Lazy as TL (Text)+import Data.Text.Lazy (toStrict)++import Foreign.C.String (CString)++#if MIN_VERSION_base(4,5,0)+import qualified Data.ByteString.Char8 as BS (pack)+import qualified Data.Text as TS (unpack)+import qualified Data.Text.Lazy as TL (unpack)++import qualified Debug.Trace as S++import GHC.Stack (currentCallStack, renderStack)+#endif++import Prelude hiding (Show(show))++import System.IO.Unsafe (unsafePerformIO)++import Text.Show.Text.Classes (Show, show)+import Text.Show.Text.Instances ()++-- $tracing+-- +-- The 'trace', 'traceShow' and 'traceIO' functions print messages to an output+-- stream. They are intended for \"printf debugging\", that is: tracing the flow+-- of execution and printing interesting values.+-- +-- All these functions evaluate the message completely before printing+-- it; so if the message is not fully defined, none of it will be+-- printed.+-- +-- The usual output stream is 'System.IO.stderr'. For Windows GUI applications+-- (that have no stderr) the output is directed to the Windows debug console.+-- Some implementations of these functions may decorate the @Text@ that\'s+-- output to indicate that you\'re tracing.++-- | The 'traceIO' function outputs the trace message from the IO monad.+-- This sequences the output with respect to other IO actions.+-- +-- /Since: 0.5/+traceIO :: TS.Text -> IO ()+traceIO = traceIOByteString . encodeUtf8++-- | Like 'traceIO' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceIOLazy :: TL.Text -> IO ()+traceIOLazy = traceIO . toStrict++traceIOByteString :: ByteString -> IO ()+traceIOByteString msg = useAsCString "%s\n" $ \cfmt -> do+ -- NB: debugBelch can't deal with null bytes, so filter them+ -- out so we don't accidentally truncate the message. See Trac #9395+ let (nulls, msg') = BS.partition (== c2w '\0') msg+ useAsCString msg' $ \cmsg ->+ debugBelch cfmt cmsg+ unless (BS.null nulls) $+ useAsCString "WARNING: previous trace message had null bytes" $ \cmsg ->+ debugBelch cfmt cmsg++-- don't use debugBelch() directly, because we cannot call varargs functions+-- using the FFI.+foreign import ccall unsafe "HsBase.h debugBelch2"+ debugBelch :: CString -> CString -> IO ()++{-|+The 'trace' function outputs the trace message given as its first argument,+before returning the second argument as its result.++For example, this returns the value of @f x@ but first outputs the message.++> trace ("calling f with x = " <> show x) (f x)++The 'trace' function should /only/ be used for debugging, or for monitoring+execution. The function is not referentially transparent: its type indicates+that it is a pure function but it has the side effect of outputting the+trace message.++/Since: 0.5/+-}+trace :: TS.Text -> a -> a+trace = traceByteString . encodeUtf8++-- | Like 'trace' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceLazy :: TL.Text -> a -> a+traceLazy = trace . toStrict++{-# NOINLINE traceByteString #-}+traceByteString :: ByteString -> a -> a+traceByteString bs expr = unsafePerformIO $ do+ traceIOByteString bs+ return expr++-- | Like 'trace' but returns the message instead of a third value.+-- +-- /Since: 0.5/+traceId :: TS.Text -> TS.Text+traceId a = trace a a++-- | Like 'traceId' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceIdLazy :: TL.Text -> TL.Text+traceIdLazy a = traceLazy a a++{-|+Like 'trace', but uses 'show' on the argument to convert it to a 'TS.Text'.++This makes it convenient for printing the values of interesting variables or+expressions inside a function. For example here we print the value of the+variables @x@ and @z@:++> f x y =+> traceShow (x, z) $ result+> where+> z = ...+> ...++/Since: 0.5/+-}+traceShow :: Show a => a -> b -> b+traceShow = trace . show++-- | Like 'traceShow' but returns the shown value instead of a third value.+-- +-- /Since: 0.5/+traceShowId :: Show a => a -> a+traceShowId a = trace (show a) a++{-|+Like 'trace' but returning unit in an arbitrary monad. Allows for convenient+use in do-notation. Note that the application of 'trace' is not an action in the+monad, as 'traceIO' is in the 'IO' monad.++> ... = do+> x <- ...+> traceM $ "x: " <> show x+> y <- ...+> traceM $ "y: " <> show y++/Since: 0.5/+-}+traceM :: Monad m => TS.Text -> m ()+traceM text = trace text $ return ()++-- | Like 'traceM' but accepts a lazy 'TL.Text' argument.+traceMLazy :: Monad m => TL.Text -> m ()+traceMLazy text = traceLazy text $ return ()++{-|+Like 'traceM', but uses 'show' on the argument to convert it to a 'TS.Text'.++> ... = do+> x <- ...+> traceMShow $ x+> y <- ...+> traceMShow $ x + y++/Since: 0.5/+-}+traceShowM :: (Show a, Monad m) => a -> m ()+traceShowM = traceM . show++#if MIN_VERSION_base(4,5,0)+-- | Like 'trace' but additionally prints a call stack if one is+-- available.+-- +-- In the current GHC implementation, the call stack is only+-- availble if the program was compiled with @-prof@; otherwise+-- 'traceStack' behaves exactly like 'trace'. Entries in the call+-- stack correspond to @SCC@ annotations, so it is a good idea to use+-- @-fprof-auto@ or @-fprof-auto-calls@ to add SCC annotations automatically.+-- +-- /Since: 0.5/+traceStack :: TS.Text -> a -> a+traceStack = traceStackByteString . encodeUtf8++-- | Like 'traceStack' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceStackLazy :: TL.Text -> a -> a+traceStackLazy = traceStack . toStrict++traceStackByteString :: ByteString -> a -> a+traceStackByteString bs expr = unsafePerformIO $ do+ traceIOByteString bs+ stack <- currentCallStack+ unless (null stack) . traceIOByteString . BS.pack $ renderStack stack+ return expr++-- $eventlog_tracing+-- +-- Eventlog tracing is a performance profiling system. These functions emit+-- extra events into the eventlog. In combination with eventlog profiling+-- tools these functions can be used for monitoring execution and+-- investigating performance problems.+-- +-- Currently only GHC provides eventlog profiling, see the GHC user guide for+-- details on how to use it. These function exists for other Haskell+-- implementations but no events are emitted. Note that the @Text@ message is+-- always evaluated, whether or not profiling is available or enabled.++-- | The 'traceEvent' function behaves like 'trace' with the difference that+-- the message is emitted to the eventlog, if eventlog profiling is available+-- and enabled at runtime.+-- +-- It is suitable for use in pure code. In an IO context use 'traceEventIO'+-- instead.+-- +-- Note that when using GHC's SMP runtime, it is possible (but rare) to get+-- duplicate events emitted if two CPUs simultaneously evaluate the same thunk+-- that uses 'traceEvent'.+-- +-- /Since: 0.5/+traceEvent :: TS.Text -> a -> a+traceEvent = S.traceEvent . TS.unpack++-- | Like 'traceEvent' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceEventLazy :: TL.Text -> a -> a+traceEventLazy = S.traceEvent . TL.unpack++-- | The 'traceEventIO' function emits a message to the eventlog, if eventlog+-- profiling is available and enabled at runtime.+-- +-- Compared to 'traceEvent', 'traceEventIO' sequences the event with respect to+-- other IO actions.+-- +-- /Since: 0.5/+traceEventIO :: TS.Text -> IO ()+traceEventIO = S.traceEventIO . TS.unpack++-- | Like 'traceEventIO' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceEventIOLazy :: TL.Text -> IO ()+traceEventIOLazy = S.traceEventIO . TL.unpack+#endif++#if MIN_VERSION_base(4,7,0)+-- $markers+-- +-- When looking at a profile for the execution of a program we often want to+-- be able to mark certain points or phases in the execution and see that+-- visually in the profile.++-- For example, a program might have several distinct phases with different+-- performance or resource behaviour in each phase. To properly interpret the+-- profile graph we really want to see when each phase starts and ends.+-- +-- Markers let us do this: we can annotate the program to emit a marker at+-- an appropriate point during execution and then see that in a profile.+-- +-- Currently this feature is only supported in GHC by the eventlog tracing+-- system, but in future it may also be supported by the heap profiling or+-- other profiling tools. These function exists for other Haskell+-- implementations but they have no effect. Note that the @Text@ message is+-- always evaluated, whether or not profiling is available or enabled.++-- | The 'traceMarker' function emits a marker to the eventlog, if eventlog+-- profiling is available and enabled at runtime. The 'TS.Text' is the name of+-- the marker. The name is just used in the profiling tools to help you keep+-- clear which marker is which.+-- +-- This function is suitable for use in pure code. In an IO context use+-- 'traceMarkerIO' instead.+-- +-- Note that when using GHC's SMP runtime, it is possible (but rare) to get+-- duplicate events emitted if two CPUs simultaneously evaluate the same thunk+-- that uses 'traceMarker'.+-- +-- /Since: 0.5/+traceMarker :: TS.Text -> a -> a+traceMarker msg = S.traceMarker $ TS.unpack msg++-- | Like 'traceMarker' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceMarkerLazy :: TL.Text -> a -> a+traceMarkerLazy msg = S.traceMarker $ TL.unpack msg++-- | The 'traceMarkerIO' function emits a marker to the eventlog, if eventlog+-- profiling is available and enabled at runtime.+-- +-- Compared to 'traceMarker', 'traceMarkerIO' sequences the event with respect to+-- other IO actions.+-- +-- /Since: 0.5/+traceMarkerIO :: TS.Text -> IO ()+traceMarkerIO = S.traceMarkerIO . TS.unpack++-- | Like 'traceMarkerIO' but accepts a lazy 'TL.Text' argument.+-- +-- /Since: 0.5/+traceMarkerIOLazy :: TL.Text -> IO ()+traceMarkerIOLazy = S.traceMarkerIO . TL.unpack+#endif
src/Text/Show/Text/Debug/Trace/Generic.hs view
@@ -1,42 +1,51 @@-{-# LANGUAGE FlexibleContexts #-} -{-| -Module: Text.Show.Text.Debug.Trace.Generic -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Functions that trace the values of 'Generic' instances (even if they are not -instances of @Show@). - -/Since: 0.6/ --} -module Text.Show.Text.Debug.Trace.Generic ( - genericTraceShow - , genericTraceShowId - , genericTraceShowM - ) where - -import GHC.Generics (Generic, Rep) - -import Text.Show.Text.Debug.Trace -import Text.Show.Text.Generic (GShow, genericShow) - --- | A 'Generic' implementation of 'traceShow'. --- --- /Since: 0.6/ -genericTraceShow :: (Generic a, GShow (Rep a)) => a -> b -> b -genericTraceShow = trace . genericShow - --- | A 'Generic' implementation of 'traceShowId'. --- --- /Since: 0.6/ -genericTraceShowId :: (Generic a, GShow (Rep a)) => a -> a -genericTraceShowId a = trace (genericShow a) a - --- | A 'Generic' implementation of 'traceShowM'. --- --- /Since: 0.6/ -genericTraceShowM :: (Generic a, GShow (Rep a), Monad m) => a -> m () +{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE FlexibleContexts #-}+#endif+{-|+Module: Text.Show.Text.Debug.Trace.Generic+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Functions that trace the values of 'Generic' instances (even if they are not+instances of @Show@). This module only exports functions if the compiler supports+generics (on GHC, 7.2 or above).++/Since: 0.6/+-}+module Text.Show.Text.Debug.Trace.Generic (+#if __GLASGOW_HASKELL__ < 702+ ) where+#else+ genericTraceShow+ , genericTraceShowId+ , genericTraceShowM+ ) where++import GHC.Generics (Generic, Rep)++import Text.Show.Text.Debug.Trace+import Text.Show.Text.Generic (GShow, genericShow)++-- | A 'Generic' implementation of 'traceShow'.+-- +-- /Since: 0.6/+genericTraceShow :: (Generic a, GShow (Rep a)) => a -> b -> b+genericTraceShow = trace . genericShow++-- | A 'Generic' implementation of 'traceShowId'.+-- +-- /Since: 0.6/+genericTraceShowId :: (Generic a, GShow (Rep a)) => a -> a+genericTraceShowId a = trace (genericShow a) a++-- | A 'Generic' implementation of 'traceShowM'.+-- +-- /Since: 0.6/+genericTraceShowM :: (Generic a, GShow (Rep a), Monad m) => a -> m () genericTraceShowM = traceM . genericShow+#endif
src/Text/Show/Text/Debug/Trace/TH.hs view
@@ -1,46 +1,46 @@-{-# LANGUAGE TemplateHaskell #-} -{-| -Module: Text.Show.Text.Debug.Trace.TH -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Functions that splice traces into source code which take arbitrary data types or -families as arguments (even if they are not instances of @Show@). You need to -enable the @TemplateHaskell@ language extension in order to use this module. - -/Since: 0.5/ --} -module Text.Show.Text.Debug.Trace.TH ( - mkTraceShow - , mkTraceShowId - , mkTraceShowM - ) where - -import Language.Haskell.TH.Syntax (Name, Q, Exp) - -import Text.Show.Text.Debug.Trace -import Text.Show.Text.TH.Internal (mkShow) - --- | Generates a lambda expression which behaves like 'traceShow' (without requiring a --- @Show@ instance). --- --- /Since: 0.5/ -mkTraceShow :: Name -> Q Exp -mkTraceShow name = [| trace . $(mkShow name) |] - --- | Generates a lambda expression which behaves like 'traceShowId' (without requiring a --- @Show@ instance). --- --- /Since: 0.5/ -mkTraceShowId :: Name -> Q Exp -mkTraceShowId name = [| \a -> trace ($(mkShow name) a) a |] - --- | Generates a lambda expression which behaves like 'traceShowM' (without requiring a --- @Show@ instance). --- --- /Since: 0.5/ -mkTraceShowM :: Name -> Q Exp +{-# LANGUAGE TemplateHaskell #-}+{-|+Module: Text.Show.Text.Debug.Trace.TH+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Functions that splice traces into source code which take arbitrary data types or+families as arguments (even if they are not instances of @Show@). You need to+enable the @TemplateHaskell@ language extension in order to use this module.++/Since: 0.5/+-}+module Text.Show.Text.Debug.Trace.TH (+ mkTraceShow+ , mkTraceShowId+ , mkTraceShowM+ ) where++import Language.Haskell.TH.Syntax (Name, Q, Exp)++import Text.Show.Text.Debug.Trace+import Text.Show.Text.TH.Internal (mkShow)++-- | Generates a lambda expression which behaves like 'traceShow' (without requiring a+-- @Show@ instance).+-- +-- /Since: 0.5/+mkTraceShow :: Name -> Q Exp+mkTraceShow name = [| trace . $(mkShow name) |]++-- | Generates a lambda expression which behaves like 'traceShowId' (without requiring a+-- @Show@ instance).+-- +-- /Since: 0.5/+mkTraceShowId :: Name -> Q Exp+mkTraceShowId name = [| \a -> trace ($(mkShow name) a) a |]++-- | Generates a lambda expression which behaves like 'traceShowM' (without requiring a+-- @Show@ instance).+-- +-- /Since: 0.5/+mkTraceShowM :: Name -> Q Exp mkTraceShowM name = [| traceM . $(mkShow name) |]
− src/Text/Show/Text/Foreign.hs
@@ -1,14 +0,0 @@-{-| -Module: Text.Show.Text.Foreign -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @Foreign@ modules. --} -module Text.Show.Text.Foreign () where - -import Text.Show.Text.Foreign.C.Types () -import Text.Show.Text.Foreign.Ptr ()
src/Text/Show/Text/Foreign/C/Types.hs view
@@ -1,488 +1,479 @@-{-# LANGUAGE CPP #-} -#if MIN_VERSION_base(4,5,0) -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE StandaloneDeriving #-} -#else -{-# LANGUAGE MagicHash #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Foreign.C.Types -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for Haskell newtypes corresponding to C -types in the Foreign Function Interface (FFI). - -/Since: 0.3/ --} -module Text.Show.Text.Foreign.C.Types ( - showbCCharPrec - , showbCSCharPrec - , showbCUChar - , showbCShortPrec - , showbCUShort - , showbCIntPrec - , showbCUInt - , showbCLongPrec - , showbCULong - , showbCPtrdiffPrec - , showbCSize - , showbCWcharPrec - , showbCSigAtomicPrec - , showbCLLongPrec - , showbCULLong - , showbCIntPtrPrec - , showbCUIntPtr - , showbCIntMaxPrec - , showbCUIntMax - , showbCClockPrec - , showbCTimePrec -#if MIN_VERSION_base(4,4,0) - , showbCUSeconds - , showbCSUSecondsPrec -#endif - , showbCFloatPrec - , showbCDoublePrec - ) where - -import Data.Text.Lazy.Builder (Builder) - -import Foreign.C.Types - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec)) -import Text.Show.Text.Data.Floating () -import Text.Show.Text.Data.Integral () - -#if !(MIN_VERSION_base(4,5,0)) -import GHC.Prim (unsafeCoerce#) - -import Text.Show.Text.Data.Floating (showbDoublePrec, showbFloatPrec) -import Text.Show.Text.Data.Integral ( showbInt8Prec - , showbInt16Prec - , showbInt32Prec - , showbInt64Prec - , showbWord8 - , showbWord16 - , showbWord32 - , showbWord64 - ) - -# include "inline.h" -#endif - --- | Convert a 'CChar' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCCharPrec :: Int -> CChar -> Builder -#if MIN_VERSION_base(4,5,0) -showbCCharPrec = showbPrec -{-# INLINE showbCCharPrec #-} -#else -showbCCharPrec p c = showbInt8Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CSChar' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCSCharPrec :: Int -> CSChar -> Builder -#if MIN_VERSION_base(4,5,0) -showbCSCharPrec = showbPrec -{-# INLINE showbCSCharPrec #-} -#else -showbCSCharPrec p c = showbInt8Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CUChar' to a 'Builder'. --- --- /Since: 0.3/ -showbCUChar :: CUChar -> Builder -#if MIN_VERSION_base(4,5,0) -showbCUChar = showb -{-# INLINE showbCUChar #-} -#else -showbCUChar c = showbWord8 $ unsafeCoerce# c -#endif - --- | Convert a 'CShort' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCShortPrec :: Int -> CShort -> Builder -#if MIN_VERSION_base(4,5,0) -showbCShortPrec = showbPrec -{-# INLINE showbCShortPrec #-} -#else -showbCShortPrec p c = showbInt16Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CUShort' to a 'Builder'. --- --- /Since: 0.3/ -showbCUShort :: CUShort -> Builder -#if MIN_VERSION_base(4,5,0) -showbCUShort = showb -{-# INLINE showbCUShort #-} -#else -showbCUShort c = showbWord16 $ unsafeCoerce# c -#endif - --- | Convert a 'CInt' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCIntPrec :: Int -> CInt -> Builder -#if MIN_VERSION_base(4,5,0) -showbCIntPrec = showbPrec -{-# INLINE showbCIntPrec #-} -#else -showbCIntPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CUInt' to a 'Builder'. --- --- /Since: 0.3/ -showbCUInt :: CUInt -> Builder -#if MIN_VERSION_base(4,5,0) -showbCUInt = showb -{-# INLINE showbCUInt #-} -#else -showbCUInt c = showbWord32 $ unsafeCoerce# c -#endif - --- | Convert a 'CLong' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCLongPrec :: Int -> CLong -> Builder -#if MIN_VERSION_base(4,5,0) -showbCLongPrec = showbPrec -{-# INLINE showbCLongPrec #-} -#else -showbCLongPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CULong' to a 'Builder'. --- --- /Since: 0.3/ -showbCULong :: CULong -> Builder -#if MIN_VERSION_base(4,5,0) -showbCULong = showb -{-# INLINE showbCULong #-} -#else -showbCULong c = showbWord32 $ unsafeCoerce# c -#endif - --- | Convert a 'CPtrdiff' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCPtrdiffPrec :: Int -> CPtrdiff -> Builder -#if MIN_VERSION_base(4,5,0) -showbCPtrdiffPrec = showbPrec -{-# INLINE showbCPtrdiffPrec #-} -#else -showbCPtrdiffPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CSize' to a 'Builder'. --- --- /Since: 0.3/ -showbCSize :: CSize -> Builder -#if MIN_VERSION_base(4,5,0) -showbCSize = showb -{-# INLINE showbCSize #-} -#else -showbCSize c = showbWord32 $ unsafeCoerce# c -#endif - --- | Convert a 'CWchar' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCWcharPrec :: Int -> CWchar -> Builder -#if MIN_VERSION_base(4,5,0) -showbCWcharPrec = showbPrec -{-# INLINE showbCWcharPrec #-} -#else -showbCWcharPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CSigAtomic' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCSigAtomicPrec :: Int -> CSigAtomic -> Builder -#if MIN_VERSION_base(4,5,0) -showbCSigAtomicPrec = showbPrec -{-# INLINE showbCSigAtomicPrec #-} -#else -showbCSigAtomicPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CLLong' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCLLongPrec :: Int -> CLLong -> Builder -#if MIN_VERSION_base(4,5,0) -showbCLLongPrec = showbPrec -{-# INLINE showbCLLongPrec #-} -#else -showbCLLongPrec p c = showbInt64Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CULLong' to a 'Builder'. --- --- /Since: 0.3/ -showbCULLong :: CULLong -> Builder -#if MIN_VERSION_base(4,5,0) -showbCULLong = showb -{-# INLINE showbCULLong #-} -#else -showbCULLong c = showbWord64 $ unsafeCoerce# c -#endif - --- | Convert a 'CIntPtr' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCIntPtrPrec :: Int -> CIntPtr -> Builder -#if MIN_VERSION_base(4,5,0) -showbCIntPtrPrec = showbPrec -{-# INLINE showbCIntPtrPrec #-} -#else -showbCIntPtrPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CUIntPtr' to a 'Builder'. --- --- /Since: 0.3/ -showbCUIntPtr :: CUIntPtr -> Builder -#if MIN_VERSION_base(4,5,0) -showbCUIntPtr = showb -{-# INLINE showbCUIntPtr #-} -#else -showbCUIntPtr c = showbWord32 $ unsafeCoerce# c -#endif - --- | Convert a 'CIntMax' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCIntMaxPrec :: Int -> CIntMax -> Builder -#if MIN_VERSION_base(4,5,0) -showbCIntMaxPrec = showbPrec -{-# INLINE showbCIntMaxPrec #-} -#else -showbCIntMaxPrec p c = showbInt64Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CUIntMax' to a 'Builder'. --- --- /Since: 0.3/ -showbCUIntMax :: CUIntMax -> Builder -#if MIN_VERSION_base(4,5,0) -showbCUIntMax = showb -{-# INLINE showbCUIntMax #-} -#else -showbCUIntMax c = showbWord64 $ unsafeCoerce# c -#endif - --- | Convert a 'CClock' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCClockPrec :: Int -> CClock -> Builder -#if MIN_VERSION_base(4,5,0) -showbCClockPrec = showbPrec -{-# INLINE showbCClockPrec #-} -#else -showbCClockPrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - --- | Convert a 'CTime' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCTimePrec :: Int -> CTime -> Builder -#if MIN_VERSION_base(4,5,0) -showbCTimePrec = showbPrec -{-# INLINE showbCTimePrec #-} -#else -showbCTimePrec p c = showbInt32Prec p $ unsafeCoerce# c -#endif - -#if MIN_VERSION_base(4,4,0) --- | Convert a 'CUSeconds' value to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbCUSeconds :: CUSeconds -> Builder -# if MIN_VERSION_base(4,5,0) -showbCUSeconds = showb -{-# INLINE showbCUSeconds #-} -# else -showbCUSeconds c = showbWord32 $ unsafeCoerce# c -# endif - --- | Convert a 'CSUSeconds' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbCSUSecondsPrec :: Int -> CSUSeconds -> Builder -# if MIN_VERSION_base(4,5,0) -showbCSUSecondsPrec = showbPrec -{-# INLINE showbCSUSecondsPrec #-} -# else -showbCSUSecondsPrec p c = showbInt32Prec p $ unsafeCoerce# c -# endif -#endif - --- | Convert a 'CFloat' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCFloatPrec :: Int -> CFloat -> Builder -#if MIN_VERSION_base(4,5,0) -showbCFloatPrec = showbPrec -{-# INLINE showbCFloatPrec #-} -#else -showbCFloatPrec p c = showbFloatPrec p $ unsafeCoerce# c -#endif - --- | Convert a 'CDouble' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCDoublePrec :: Int -> CDouble -> Builder -#if MIN_VERSION_base(4,5,0) -showbCDoublePrec = showbPrec -{-# INLINE showbCDoublePrec #-} -#else -showbCDoublePrec p c = showbDoublePrec p $ unsafeCoerce# c -#endif - -#if MIN_VERSION_base(4,5,0) -deriving instance Show CChar -deriving instance Show CSChar -deriving instance Show CUChar -deriving instance Show CShort -deriving instance Show CUShort -deriving instance Show CInt -deriving instance Show CUInt -deriving instance Show CLong -deriving instance Show CULong -deriving instance Show CPtrdiff -deriving instance Show CSize -deriving instance Show CWchar -deriving instance Show CSigAtomic -deriving instance Show CLLong -deriving instance Show CULLong -deriving instance Show CIntPtr -deriving instance Show CUIntPtr -deriving instance Show CIntMax -deriving instance Show CUIntMax -deriving instance Show CClock -deriving instance Show CTime -# if MIN_VERSION_base(4,4,0) -deriving instance Show CUSeconds -deriving instance Show CSUSeconds -# endif -deriving instance Show CFloat -deriving instance Show CDouble -#else -instance Show CChar where - showbPrec = showbCCharPrec - INLINE_INST_FUN(showbPrec) - -instance Show CSChar where - showbPrec = showbCSCharPrec - INLINE_INST_FUN(showbPrec) - -instance Show CUChar where - showb = showbCUChar - INLINE_INST_FUN(showb) - -instance Show CShort where - showbPrec = showbCShortPrec - INLINE_INST_FUN(showbPrec) - -instance Show CUShort where - showb = showbCUShort - INLINE_INST_FUN(showb) - -instance Show CInt where - showbPrec = showbCIntPrec - INLINE_INST_FUN(showbPrec) - -instance Show CUInt where - showb = showbCUInt - INLINE_INST_FUN(showb) - -instance Show CLong where - showbPrec = showbCLongPrec - INLINE_INST_FUN(showbPrec) - -instance Show CULong where - showb = showbCULong - INLINE_INST_FUN(showb) - -instance Show CPtrdiff where - showbPrec = showbCPtrdiffPrec - INLINE_INST_FUN(showbPrec) - -instance Show CSize where - showb = showbCSize - INLINE_INST_FUN(showb) - -instance Show CWchar where - showbPrec = showbCWcharPrec - INLINE_INST_FUN(showbPrec) - -instance Show CSigAtomic where - showbPrec = showbCSigAtomicPrec - INLINE_INST_FUN(showbPrec) - -instance Show CLLong where - showbPrec = showbCLLongPrec - INLINE_INST_FUN(showbPrec) - -instance Show CULLong where - showb = showbCULLong - INLINE_INST_FUN(showb) - -instance Show CIntPtr where - showbPrec = showbCIntPtrPrec - INLINE_INST_FUN(showbPrec) - -instance Show CUIntPtr where - showb = showbCUIntPtr - INLINE_INST_FUN(showb) - -instance Show CIntMax where - showbPrec = showbCIntMaxPrec - INLINE_INST_FUN(showbPrec) - -instance Show CUIntMax where - showb = showbCUIntMax - INLINE_INST_FUN(showb) - -instance Show CClock where - showbPrec = showbCClockPrec - INLINE_INST_FUN(showbPrec) - -instance Show CTime where - showbPrec = showbCTimePrec - INLINE_INST_FUN(showbPrec) - -# if MIN_VERSION_base(4,4,0) -instance Show CUSeconds where - showb = showbCUSeconds - INLINE_INST_FUN(showb) - -instance Show CSUSeconds where - showbPrec = showbCSUSecondsPrec - INLINE_INST_FUN(showbPrec) -# endif - -instance Show CFloat where - showbPrec = showbCFloatPrec - INLINE_INST_FUN(showbPrec) - -instance Show CDouble where - showbPrec = showbCDoublePrec - INLINE_INST_FUN(showbPrec) -#endif +{-# LANGUAGE CPP #-}+#if MIN_VERSION_base(4,5,0)+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+#endif+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Foreign.C.Types+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for Haskell newtypes corresponding to C+types in the Foreign Function Interface (FFI).++/Since: 0.3/+-}+module Text.Show.Text.Foreign.C.Types (+ showbCCharPrec+ , showbCSCharPrec+ , showbCUChar+ , showbCShortPrec+ , showbCUShort+ , showbCIntPrec+ , showbCUInt+ , showbCLongPrec+ , showbCULong+ , showbCPtrdiffPrec+ , showbCSize+ , showbCWcharPrec+ , showbCSigAtomicPrec+ , showbCLLongPrec+ , showbCULLong+ , showbCIntPtrPrec+ , showbCUIntPtr+ , showbCIntMaxPrec+ , showbCUIntMax+ , showbCClockPrec+ , showbCTimePrec+#if MIN_VERSION_base(4,4,0)+ , showbCUSeconds+ , showbCSUSecondsPrec+#endif+ , showbCFloatPrec+ , showbCDoublePrec+ ) where++import Data.Text.Lazy.Builder (Builder)++import Foreign.C.Types++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Data.Floating ()+import Text.Show.Text.Data.Integral ()++#if !(MIN_VERSION_base(4,5,0))+import Data.Int+import Data.Word++import Unsafe.Coerce (unsafeCoerce)++# include "HsBaseConfig.h"+# include "inline.h"+#endif++-- | Convert a 'CChar' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCCharPrec :: Int -> CChar -> Builder+#if MIN_VERSION_base(4,5,0)+showbCCharPrec = showbPrec+{-# INLINE showbCCharPrec #-}+#else+showbCCharPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_CHAR -> Builder)+#endif++-- | Convert a 'CSChar' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCSCharPrec :: Int -> CSChar -> Builder+#if MIN_VERSION_base(4,5,0)+showbCSCharPrec = showbPrec+{-# INLINE showbCSCharPrec #-}+#else+showbCSCharPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_SIGNED_CHAR -> Builder)+#endif++-- | Convert a 'CUChar' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUChar :: CUChar -> Builder+#if MIN_VERSION_base(4,5,0)+showbCUChar = showb+{-# INLINE showbCUChar #-}+#else+showbCUChar = unsafeCoerce (showb :: HTYPE_UNSIGNED_CHAR -> Builder)+#endif++-- | Convert a 'CShort' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCShortPrec :: Int -> CShort -> Builder+#if MIN_VERSION_base(4,5,0)+showbCShortPrec = showbPrec+{-# INLINE showbCShortPrec #-}+#else+showbCShortPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_SHORT -> Builder)+#endif++-- | Convert a 'CUShort' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUShort :: CUShort -> Builder+#if MIN_VERSION_base(4,5,0)+showbCUShort = showb+{-# INLINE showbCUShort #-}+#else+showbCUShort = unsafeCoerce (showb :: HTYPE_UNSIGNED_SHORT -> Builder)+#endif++-- | Convert a 'CInt' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCIntPrec :: Int -> CInt -> Builder+#if MIN_VERSION_base(4,5,0)+showbCIntPrec = showbPrec+{-# INLINE showbCIntPrec #-}+#else+showbCIntPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_INT -> Builder)+#endif++-- | Convert a 'CUInt' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUInt :: CUInt -> Builder+#if MIN_VERSION_base(4,5,0)+showbCUInt = showb+{-# INLINE showbCUInt #-}+#else+showbCUInt = unsafeCoerce (showb :: HTYPE_UNSIGNED_INT -> Builder)+#endif++-- | Convert a 'CLong' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCLongPrec :: Int -> CLong -> Builder+#if MIN_VERSION_base(4,5,0)+showbCLongPrec = showbPrec+{-# INLINE showbCLongPrec #-}+#else+showbCLongPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_LONG -> Builder)+#endif++-- | Convert a 'CULong' to a 'Builder'.+-- +-- /Since: 0.3/+showbCULong :: CULong -> Builder+#if MIN_VERSION_base(4,5,0)+showbCULong = showb+{-# INLINE showbCULong #-}+#else+showbCULong = unsafeCoerce (showb :: HTYPE_UNSIGNED_LONG -> Builder)+#endif++-- | Convert a 'CPtrdiff' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCPtrdiffPrec :: Int -> CPtrdiff -> Builder+#if MIN_VERSION_base(4,5,0)+showbCPtrdiffPrec = showbPrec+{-# INLINE showbCPtrdiffPrec #-}+#else+showbCPtrdiffPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_PTRDIFF_T -> Builder)+#endif++-- | Convert a 'CSize' to a 'Builder'.+-- +-- /Since: 0.3/+showbCSize :: CSize -> Builder+#if MIN_VERSION_base(4,5,0)+showbCSize = showb+{-# INLINE showbCSize #-}+#else+showbCSize = unsafeCoerce (showb :: HTYPE_SIZE_T -> Builder)+#endif++-- | Convert a 'CWchar' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCWcharPrec :: Int -> CWchar -> Builder+#if MIN_VERSION_base(4,5,0)+showbCWcharPrec = showbPrec+{-# INLINE showbCWcharPrec #-}+#else+showbCWcharPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_WCHAR_T -> Builder)+#endif++-- | Convert a 'CSigAtomic' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCSigAtomicPrec :: Int -> CSigAtomic -> Builder+#if MIN_VERSION_base(4,5,0)+showbCSigAtomicPrec = showbPrec+{-# INLINE showbCSigAtomicPrec #-}+#else+showbCSigAtomicPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_SIG_ATOMIC_T -> Builder)+#endif++-- | Convert a 'CLLong' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCLLongPrec :: Int -> CLLong -> Builder+#if MIN_VERSION_base(4,5,0)+showbCLLongPrec = showbPrec+{-# INLINE showbCLLongPrec #-}+#else+showbCLLongPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_LONG_LONG -> Builder)+#endif++-- | Convert a 'CULLong' to a 'Builder'.+-- +-- /Since: 0.3/+showbCULLong :: CULLong -> Builder+#if MIN_VERSION_base(4,5,0)+showbCULLong = showb+{-# INLINE showbCULLong #-}+#else+showbCULLong = unsafeCoerce (showb :: HTYPE_UNSIGNED_LONG_LONG -> Builder)+#endif++-- | Convert a 'CIntPtr' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCIntPtrPrec :: Int -> CIntPtr -> Builder+#if MIN_VERSION_base(4,5,0)+showbCIntPtrPrec = showbPrec+{-# INLINE showbCIntPtrPrec #-}+#else+showbCIntPtrPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_INTPTR_T -> Builder)+#endif++-- | Convert a 'CUIntPtr' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUIntPtr :: CUIntPtr -> Builder+#if MIN_VERSION_base(4,5,0)+showbCUIntPtr = showb+{-# INLINE showbCUIntPtr #-}+#else+showbCUIntPtr = unsafeCoerce (showb :: HTYPE_UINTPTR_T -> Builder)+#endif++-- | Convert a 'CIntMax' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCIntMaxPrec :: Int -> CIntMax -> Builder+#if MIN_VERSION_base(4,5,0)+showbCIntMaxPrec = showbPrec+{-# INLINE showbCIntMaxPrec #-}+#else+showbCIntMaxPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_INTMAX_T -> Builder)+#endif++-- | Convert a 'CUIntMax' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUIntMax :: CUIntMax -> Builder+#if MIN_VERSION_base(4,5,0)+showbCUIntMax = showb+{-# INLINE showbCUIntMax #-}+#else+showbCUIntMax = unsafeCoerce (showb :: HTYPE_UINTMAX_T -> Builder)+#endif++-- | Convert a 'CClock' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCClockPrec :: Int -> CClock -> Builder+#if MIN_VERSION_base(4,5,0)+showbCClockPrec = showbPrec+{-# INLINE showbCClockPrec #-}+#else+showbCClockPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_CLOCK_T -> Builder)+#endif++-- | Convert a 'CTime' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCTimePrec :: Int -> CTime -> Builder+#if MIN_VERSION_base(4,5,0)+showbCTimePrec = showbPrec+{-# INLINE showbCTimePrec #-}+#else+showbCTimePrec = unsafeCoerce (showbPrec :: Int -> HTYPE_TIME_T -> Builder)+#endif++#if MIN_VERSION_base(4,4,0)+-- | Convert a 'CUSeconds' value to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbCUSeconds :: CUSeconds -> Builder+# if MIN_VERSION_base(4,5,0)+showbCUSeconds = showb+{-# INLINE showbCUSeconds #-}+# else+showbCUSeconds = unsafeCoerce (showb :: HTYPE_USECONDS_T -> Builder)+# endif++-- | Convert a 'CSUSeconds' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbCSUSecondsPrec :: Int -> CSUSeconds -> Builder+# if MIN_VERSION_base(4,5,0)+showbCSUSecondsPrec = showbPrec+{-# INLINE showbCSUSecondsPrec #-}+# else+showbCSUSecondsPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_SUSECONDS_T -> Builder)+# endif+#endif++-- | Convert a 'CFloat' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCFloatPrec :: Int -> CFloat -> Builder+#if MIN_VERSION_base(4,5,0)+showbCFloatPrec = showbPrec+{-# INLINE showbCFloatPrec #-}+#else+showbCFloatPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_FLOAT -> Builder)+#endif++-- | Convert a 'CDouble' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCDoublePrec :: Int -> CDouble -> Builder+#if MIN_VERSION_base(4,5,0)+showbCDoublePrec = showbPrec+{-# INLINE showbCDoublePrec #-}+#else+showbCDoublePrec = unsafeCoerce (showbPrec :: Int -> HTYPE_DOUBLE -> Builder)+#endif++#if MIN_VERSION_base(4,5,0)+deriving instance Show CChar+deriving instance Show CSChar+deriving instance Show CUChar+deriving instance Show CShort+deriving instance Show CUShort+deriving instance Show CInt+deriving instance Show CUInt+deriving instance Show CLong+deriving instance Show CULong+deriving instance Show CPtrdiff+deriving instance Show CSize+deriving instance Show CWchar+deriving instance Show CSigAtomic+deriving instance Show CLLong+deriving instance Show CULLong+deriving instance Show CIntPtr+deriving instance Show CUIntPtr+deriving instance Show CIntMax+deriving instance Show CUIntMax+deriving instance Show CClock+deriving instance Show CTime+# if MIN_VERSION_base(4,4,0)+deriving instance Show CUSeconds+deriving instance Show CSUSeconds+# endif+deriving instance Show CFloat+deriving instance Show CDouble+#else+instance Show CChar where+ showbPrec = showbCCharPrec+ INLINE_INST_FUN(showbPrec)++instance Show CSChar where+ showbPrec = showbCSCharPrec+ INLINE_INST_FUN(showbPrec)++instance Show CUChar where+ showb = showbCUChar+ INLINE_INST_FUN(showb)++instance Show CShort where+ showbPrec = showbCShortPrec+ INLINE_INST_FUN(showbPrec)++instance Show CUShort where+ showb = showbCUShort+ INLINE_INST_FUN(showb)++instance Show CInt where+ showbPrec = showbCIntPrec+ INLINE_INST_FUN(showbPrec)++instance Show CUInt where+ showb = showbCUInt+ INLINE_INST_FUN(showb)++instance Show CLong where+ showbPrec = showbCLongPrec+ INLINE_INST_FUN(showbPrec)++instance Show CULong where+ showb = showbCULong+ INLINE_INST_FUN(showb)++instance Show CPtrdiff where+ showbPrec = showbCPtrdiffPrec+ INLINE_INST_FUN(showbPrec)++instance Show CSize where+ showb = showbCSize+ INLINE_INST_FUN(showb)++instance Show CWchar where+ showbPrec = showbCWcharPrec+ INLINE_INST_FUN(showbPrec)++instance Show CSigAtomic where+ showbPrec = showbCSigAtomicPrec+ INLINE_INST_FUN(showbPrec)++instance Show CLLong where+ showbPrec = showbCLLongPrec+ INLINE_INST_FUN(showbPrec)++instance Show CULLong where+ showb = showbCULLong+ INLINE_INST_FUN(showb)++instance Show CIntPtr where+ showbPrec = showbCIntPtrPrec+ INLINE_INST_FUN(showbPrec)++instance Show CUIntPtr where+ showb = showbCUIntPtr+ INLINE_INST_FUN(showb)++instance Show CIntMax where+ showbPrec = showbCIntMaxPrec+ INLINE_INST_FUN(showbPrec)++instance Show CUIntMax where+ showb = showbCUIntMax+ INLINE_INST_FUN(showb)++instance Show CClock where+ showbPrec = showbCClockPrec+ INLINE_INST_FUN(showbPrec)++instance Show CTime where+ showbPrec = showbCTimePrec+ INLINE_INST_FUN(showbPrec)++# if MIN_VERSION_base(4,4,0)+instance Show CUSeconds where+ showb = showbCUSeconds+ INLINE_INST_FUN(showb)++instance Show CSUSeconds where+ showbPrec = showbCSUSecondsPrec+ INLINE_INST_FUN(showbPrec)+# endif++instance Show CFloat where+ showbPrec = showbCFloatPrec+ INLINE_INST_FUN(showbPrec)++instance Show CDouble where+ showbPrec = showbCDoublePrec+ INLINE_INST_FUN(showbPrec)+#endif
src/Text/Show/Text/Foreign/Ptr.hs view
@@ -1,116 +1,117 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Foreign.Ptr -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for pointer types used in the Haskell -Foreign Function Interface (FFI). - -/Since: 0.3/ --} -module Text.Show.Text.Foreign.Ptr ( - showbPtr - , showbFunPtr - , showbIntPtrPrec - , showbWordPtr - , showbForeignPtr - ) where - -import Data.Semigroup (timesN) -import Data.Text.Lazy.Builder (Builder) - -import Foreign.ForeignPtr (ForeignPtr) -import Foreign.Ptr (FunPtr, IntPtr, WordPtr, castFunPtrToPtr) - -import GHC.ForeignPtr (unsafeForeignPtrToPtr) -import GHC.Num (wordToInteger) -import GHC.Ptr (Ptr(..)) -import GHC.Prim (addr2Int#, int2Word#, unsafeCoerce#) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.Data.Integral (showbHex, showbIntPrec, showbWord) -import Text.Show.Text.Utils ((<>), lengthB, s) - -#include "MachDeps.h" -#include "inline.h" - --- | Convert a 'Ptr' to a 'Builder'. Note that this does not require the parameterized --- type to be an instance of 'Show' itself. --- --- /Since: 0.3/ -showbPtr :: Ptr a -> Builder -showbPtr (Ptr a) = padOut . showbHex $ wordToInteger (int2Word# (addr2Int# a)) - where - padOut :: Builder -> Builder - padOut ls = - s '0' <> s 'x' - <> timesN (fromIntegral . max 0 $ 2*SIZEOF_HSPTR - lengthB ls) (s '0') - <> ls - --- | Convert a 'FunPtr' to a 'Builder'. Note that this does not require the --- parameterized type to be an instance of 'Show' itself. --- --- /Since: 0.3/ -showbFunPtr :: FunPtr a -> Builder -showbFunPtr = showb . castFunPtrToPtr -{-# INLINE showbFunPtr #-} - --- | Convert an 'IntPtr' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbIntPtrPrec :: Int -> IntPtr -> Builder -showbIntPtrPrec p ip = showbIntPrec p $ unsafeCoerce# ip - --- | Convert a 'WordPtr' to a 'Builder'. --- --- /Since: 0.3/ -showbWordPtr :: WordPtr -> Builder -showbWordPtr wp = showbWord $ unsafeCoerce# wp - --- | Convert a 'ForeignPtr' to a 'Builder'. Note that this does not require the --- parameterized type to be an instance of 'Show' itself. --- --- /Since: 0.3/ -showbForeignPtr :: ForeignPtr a -> Builder -showbForeignPtr = showb . unsafeForeignPtrToPtr -{-# INLINE showbForeignPtr #-} - -instance Show (Ptr a) where - showb = showbPtr - INLINE_INST_FUN(showb) - -instance Show1 Ptr where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show (FunPtr a) where - showb = showbFunPtr - INLINE_INST_FUN(showb) - -instance Show1 FunPtr where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) - -instance Show IntPtr where - showbPrec = showbIntPtrPrec - INLINE_INST_FUN(showbPrec) - -instance Show WordPtr where - showb = showbWordPtr - INLINE_INST_FUN(showb) - -instance Show (ForeignPtr a) where - showb = showbForeignPtr - INLINE_INST_FUN(showb) - -instance Show1 ForeignPtr where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Foreign.Ptr+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for pointer types used in the Haskell+Foreign Function Interface (FFI).++/Since: 0.3/+-}+module Text.Show.Text.Foreign.Ptr (+ showbPtr+ , showbFunPtr+ , showbIntPtrPrec+ , showbWordPtr+ , showbForeignPtr+ ) where++import Data.Monoid.Compat ((<>))+import Data.Semigroup (timesN)+import Data.Text.Lazy.Builder (Builder)++import Foreign.ForeignPtr (ForeignPtr)+import Foreign.Ptr (FunPtr, IntPtr, WordPtr, castFunPtrToPtr)++import GHC.ForeignPtr (unsafeForeignPtrToPtr)+import GHC.Num (wordToInteger)+import GHC.Ptr (Ptr(..))+import GHC.Prim (addr2Int#, int2Word#, unsafeCoerce#)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.Data.Integral (showbHex, showbIntPrec, showbWord)+import Text.Show.Text.Utils (lengthB, s)++#include "MachDeps.h"+#include "inline.h"++-- | Convert a 'Ptr' to a 'Builder'. Note that this does not require the parameterized+-- type to be an instance of 'Show' itself.+-- +-- /Since: 0.3/+showbPtr :: Ptr a -> Builder+showbPtr (Ptr a) = padOut . showbHex $ wordToInteger (int2Word# (addr2Int# a))+ where+ padOut :: Builder -> Builder+ padOut ls =+ s '0' <> s 'x'+ <> timesN (fromIntegral . max 0 $ 2*SIZEOF_HSPTR - lengthB ls) (s '0')+ <> ls++-- | Convert a 'FunPtr' to a 'Builder'. Note that this does not require the+-- parameterized type to be an instance of 'Show' itself.+-- +-- /Since: 0.3/+showbFunPtr :: FunPtr a -> Builder+showbFunPtr = showb . castFunPtrToPtr+{-# INLINE showbFunPtr #-}++-- | Convert an 'IntPtr' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbIntPtrPrec :: Int -> IntPtr -> Builder+showbIntPtrPrec p ip = showbIntPrec p $ unsafeCoerce# ip++-- | Convert a 'WordPtr' to a 'Builder'.+-- +-- /Since: 0.3/+showbWordPtr :: WordPtr -> Builder+showbWordPtr wp = showbWord $ unsafeCoerce# wp++-- | Convert a 'ForeignPtr' to a 'Builder'. Note that this does not require the+-- parameterized type to be an instance of 'Show' itself.+-- +-- /Since: 0.3/+showbForeignPtr :: ForeignPtr a -> Builder+showbForeignPtr = showb . unsafeForeignPtrToPtr+{-# INLINE showbForeignPtr #-}++instance Show (Ptr a) where+ showb = showbPtr+ INLINE_INST_FUN(showb)++instance Show1 Ptr where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show (FunPtr a) where+ showb = showbFunPtr+ INLINE_INST_FUN(showb)++instance Show1 FunPtr where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++instance Show IntPtr where+ showbPrec = showbIntPtrPrec+ INLINE_INST_FUN(showbPrec)++instance Show WordPtr where+ showb = showbWordPtr+ INLINE_INST_FUN(showb)++instance Show (ForeignPtr a) where+ showb = showbForeignPtr+ INLINE_INST_FUN(showb)++instance Show1 ForeignPtr where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
src/Text/Show/Text/Functions.hs view
@@ -1,37 +1,37 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Functions -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Optional 'Show' and 'Show1' instances for functions. - -/Since: 0.3/ --} -module Text.Show.Text.Functions (showbFunction) where - -import Data.Text.Lazy.Builder (Builder) -import Prelude hiding (Show) -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) - -#include "inline.h" - --- | Convert a function to a 'Builder'. --- --- /Since: 0.3/ -showbFunction :: (a -> b) -> Builder -showbFunction _ = "<function>" -{-# INLINE showbFunction #-} - -instance Show (a -> b) where - showb = showbFunction - INLINE_INST_FUN(showb) - -instance Show1 ((->) a) where - showbPrec1 = showbPrec - INLINE_INST_FUN(showbPrec1) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Functions+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Optional 'Show' and 'Show1' instances for functions.++/Since: 0.3/+-}+module Text.Show.Text.Functions (showbFunction) where++import Data.Text.Lazy.Builder (Builder)+import Prelude ()+import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))++#include "inline.h"++-- | Convert a function to a 'Builder'.+-- +-- /Since: 0.3/+showbFunction :: (a -> b) -> Builder+showbFunction _ = "<function>"+{-# INLINE showbFunction #-}++instance Show (a -> b) where+ showb = showbFunction+ INLINE_INST_FUN(showb)++instance Show1 ((->) a) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)
− src/Text/Show/Text/GHC.hs
@@ -1,33 +0,0 @@-{-# LANGUAGE CPP #-} -{-| -Module: Text.Show.Text.GHC -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @GHC@ modules. --} -module Text.Show.Text.GHC () where - -#if defined(mingw32_HOST_OS) -import Text.Show.Text.GHC.Conc.Windows () -#endif -#if MIN_VERSION_base(4,4,0) -# if !defined(mingw32_HOST_OS) -import Text.Show.Text.GHC.Event () -# endif -import Text.Show.Text.GHC.Fingerprint () -import Text.Show.Text.GHC.Generics () -#endif -#if MIN_VERSION_base(4,8,0) -import Text.Show.Text.GHC.RTS.Flags () -import Text.Show.Text.GHC.StaticPtr () -#endif -#if MIN_VERSION_base(4,5,0) -import Text.Show.Text.GHC.Stats () -#endif -#if MIN_VERSION_base(4,6,0) -import Text.Show.Text.GHC.TypeLits () -#endif
src/Text/Show/Text/GHC/Conc/Windows.hs view
@@ -1,43 +1,42 @@-{-# LANGUAGE CPP #-} -#if !defined(__GHCJS__) -{-# LANGUAGE TemplateHaskell #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.Conc.Windows -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'ConsoleEvent'. -This module is only available on Windows. - -Note that this module does not export anything on GHCJS. - -/Since: 0.5/ --} -module Text.Show.Text.GHC.Conc.Windows ( -#if defined(__GHCJS__) - ) where -#else - showbConsoleEvent - ) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.Conc.Windows (ConsoleEvent) - -import Text.Show.Text.Classes (showb) -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb) - --- | Convert a 'ConsoleEvent' to a 'Builder'. --- --- /Since: 0.5/ -showbConsoleEvent :: ConsoleEvent -> Builder -showbConsoleEvent = showb -{-# INLINE showbConsoleEvent #-} - -$(deriveShowPragmas defaultInlineShowb ''ConsoleEvent) -#endif +{-# LANGUAGE CPP #-}++#if !defined(__GHCJS__) && defined(mingw32_HOST_OS)+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.Conc.Windows+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'ConsoleEvent'.+This module only exports functions if using Windows, and not using GHCJS.++/Since: 0.5/+-}+module Text.Show.Text.GHC.Conc.Windows (+#if defined(__GHCJS__) || !defined(mingw32_HOST_OS)+ ) where+#else+ showbConsoleEvent+ ) where++import Data.Text.Lazy.Builder (Builder)++import GHC.Conc.Windows (ConsoleEvent)++import Text.Show.Text.Classes (showb)+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb)++-- | Convert a 'ConsoleEvent' to a 'Builder'.+-- +-- /Since: 0.5/+showbConsoleEvent :: ConsoleEvent -> Builder+showbConsoleEvent = showb+{-# INLINE showbConsoleEvent #-}++$(deriveShowPragmas defaultInlineShowb ''ConsoleEvent)+#endif
src/Text/Show/Text/GHC/Event.hs view
@@ -1,57 +1,58 @@-{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.Event -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @Event@ module. -This module is only available with @base-4.4.0.0@ or later and is not available -on Windows. - -Note that this module does not export anything on GHCJS. - -/Since: 0.3/ --} -module Text.Show.Text.GHC.Event ( -#if defined(__GHCJS__) - ) where -#else - showbEvent - , showbFdKeyPrec - ) where - -import Data.Text.Lazy.Builder (Builder) -import GHC.Event (Event, FdKey) -import Prelude hiding (Show) -import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..)) - --- | Convert an 'Event' to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later and is not available --- on Windows. --- --- /Since: 0.3/ -showbEvent :: Event -> Builder -showbEvent = showb . FromStringShow -{-# INLINE showbEvent #-} - --- | Convert an 'FdKey' to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later and is not available --- on Windows. --- --- /Since: 0.3/ -showbFdKeyPrec :: Int -> FdKey -> Builder -showbFdKeyPrec p = showbPrec p . FromStringShow -{-# INLINE showbFdKeyPrec #-} - -instance Show Event where - showb = showbEvent - {-# INLINE showb #-} - -instance Show FdKey where - showbPrec = showbFdKeyPrec - {-# INLINE showbPrec #-} -#endif +{-# LANGUAGE CPP #-}++#if !defined(__GHCJS__) && !defined(mingw32_HOST_OS) && MIN_VERSION_base(4,4,0)+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.Event+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @Event@ module.+This module only exports functions if using @base-4.4.0.0@ on a platform other+than Windows or GHCJS.++/Since: 0.3/+-}+module Text.Show.Text.GHC.Event (+#if defined(__GHCJS__) || defined(mingw32_HOST_OS) || !(MIN_VERSION_base(4,4,0))+ ) where+#else+ showbEvent+ , showbFdKeyPrec+ ) where ++import Data.Text.Lazy.Builder (Builder)+import GHC.Event (Event, FdKey)+import Prelude hiding (Show)+import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..))++-- | Convert an 'Event' to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later and is not available+-- on Windows.+-- +-- /Since: 0.3/+showbEvent :: Event -> Builder+showbEvent = showb . FromStringShow+{-# INLINE showbEvent #-}++-- | Convert an 'FdKey' to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later and is not available+-- on Windows.+-- +-- /Since: 0.3/+showbFdKeyPrec :: Int -> FdKey -> Builder+showbFdKeyPrec p = showbPrec p . FromStringShow+{-# INLINE showbFdKeyPrec #-}++instance Show Event where+ showb = showbEvent+ {-# INLINE showb #-}++instance Show FdKey where+ showbPrec = showbFdKeyPrec+ {-# INLINE showbPrec #-}+#endif
src/Text/Show/Text/GHC/Fingerprint.hs view
@@ -1,42 +1,53 @@-{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.Fingerprint -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Fingerprint' values. -This module is only available with @base-4.4.0.0@ or later. - -/Since: 0.5/ --} -module Text.Show.Text.GHC.Fingerprint (showbFingerprint) where - -import Data.Semigroup (timesN) -import Data.Text.Lazy.Builder (Builder) -import Data.Word (Word64) - -import GHC.Fingerprint.Type (Fingerprint(..)) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb)) -import Text.Show.Text.Data.Integral (showbHex) -import Text.Show.Text.Utils ((<>), lengthB, s) - --- | Convert a 'Fingerprint' to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.5/ -showbFingerprint :: Fingerprint -> Builder -showbFingerprint (Fingerprint w1 w2) = hex16 w1 <> hex16 w2 - where - hex16 :: Word64 -> Builder - hex16 i = let hex = showbHex i - in timesN (fromIntegral . max 0 $ 16 - lengthB hex) (s '0') <> hex - -instance Show Fingerprint where - showb = showbFingerprint - {-# INLINE showb #-} +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,4,0)+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.Fingerprint+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Fingerprint' values.+This module only exports functions if using @base-4.4.0.0@ or later.++/Since: 0.5/+-}+module Text.Show.Text.GHC.Fingerprint (+#if !(MIN_VERSION_base(4,4,0))+ ) where+#else+ showbFingerprint+ ) where++import Data.Monoid.Compat ((<>))+import Data.Semigroup (timesN)+import Data.Text.Lazy.Builder (Builder)+import Data.Word (Word64)++import GHC.Fingerprint.Type (Fingerprint(..))++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb))+import Text.Show.Text.Data.Integral (showbHex)+import Text.Show.Text.Utils (lengthB, s)++-- | Convert a 'Fingerprint' to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.5/+showbFingerprint :: Fingerprint -> Builder+showbFingerprint (Fingerprint w1 w2) = hex16 w1 <> hex16 w2+ where+ hex16 :: Word64 -> Builder+ hex16 i = let hex = showbHex i+ in timesN (fromIntegral . max 0 $ 16 - lengthB hex) (s '0') <> hex++instance Show Fingerprint where+ showb = showbFingerprint+ {-# INLINE showb #-}+#endif
src/Text/Show/Text/GHC/Generics.hs view
@@ -1,186 +1,197 @@-{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE TypeOperators #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.Generics -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for generics-related data types. -This module is only available with @base-4.4.0.0@ or later. - -/Since: 0.3/ --} -module Text.Show.Text.GHC.Generics ( - showbU1 - , showbPar1Prec - , showbRec1Prec - , showbK1Prec - , showbM1Prec - , showbSumTypePrec - , showbProductTypePrec - , showbCompFunctorsPrec - , showbFixityPrec - , showbAssociativity - , showbArityPrec - ) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.Generics (U1(..), Par1, Rec1(..), K1(..), - M1(..), (:+:)(..), (:*:)(..), (:.:)(..), - Fixity, Associativity, Arity) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1)) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb, - defaultInlineShowbPrec, mkShowbPrec) - --- | Convert a 'U1' value to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbU1 :: U1 p -> Builder -showbU1 = showb -{-# INLINE showbU1 #-} - --- | Convert a 'Par1' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbPar1Prec :: Show p => Int -> Par1 p -> Builder -showbPar1Prec = showbPrec -{-# INLINE showbPar1Prec #-} - --- | Convert a 'Rec1' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbRec1Prec :: Show (f p) => Int -> Rec1 f p -> Builder -showbRec1Prec = showbPrec -{-# INLINE showbRec1Prec #-} - --- | Convert a 'K1' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbK1Prec :: Show c => Int -> K1 i c p -> Builder -showbK1Prec = showbPrec -{-# INLINE showbK1Prec #-} - --- | Convert an 'M1' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbM1Prec :: Show (f p) => Int -> M1 i c f p -> Builder -showbM1Prec = showbPrec -{-# INLINE showbM1Prec #-} - --- | Convert a '(:+:)' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbSumTypePrec :: (Show (f p), Show (g p)) => Int -> (f :+: g) p -> Builder -showbSumTypePrec = showbPrec -{-# INLINE showbSumTypePrec #-} - --- | Convert a '(:*:)' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbProductTypePrec :: (Show (f p), Show (g p)) => Int -> (f :*: g) p -> Builder -showbProductTypePrec = showbPrec -{-# INLINE showbProductTypePrec #-} - --- | Convert a '(:.:)' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbCompFunctorsPrec :: Show (f (g p)) => Int -> (f :.: g) p -> Builder -showbCompFunctorsPrec = showbPrec -{-# INLINE showbCompFunctorsPrec #-} - --- | Convert a 'Fixity' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbFixityPrec :: Int -> Fixity -> Builder -showbFixityPrec = showbPrec -{-# INLINE showbFixityPrec #-} - --- | Convert an 'Associativity' value to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbAssociativity :: Associativity -> Builder -showbAssociativity = showb -{-# INLINE showbAssociativity #-} - --- | Convert an 'Arity' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbArityPrec :: Int -> Arity -> Builder -showbArityPrec = showbPrec -{-# INLINE showbArityPrec #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show (U1 p) where - showbPrec = $(mkShowbPrec ''U1) - {-# INLINE showb #-} - -instance Show1 U1 where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Par1) - -instance Show1 Par1 where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} - --- TODO: Derive with TH once it can detect higher-kinded types properly -instance Show (f p) => Show (Rec1 f p) where - showbPrec = $(mkShowbPrec ''Rec1) - {-# INLINE showbPrec #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show c => Show (K1 i c p) where - showbPrec = $(mkShowbPrec ''K1) - {-# INLINE showbPrec #-} - --- TODO: Derive with TH once it can detect phantom types properly -instance Show c => Show1 (K1 i c) where - showbPrec1 = showbPrec - {-# INLINE showbPrec1 #-} - --- TODO: Derive with TH once it can detect phantom types --- and higher-kinded types properly -instance Show (f p) => Show (M1 i c f p) where - showbPrec = $(mkShowbPrec ''M1) - {-# INLINE showbPrec #-} - --- TODO: Derive with TH once it can detect higher-kinded types properly -instance (Show (f p), Show (g p)) => Show ((f :+: g) p) where - showbPrec = $(mkShowbPrec ''(:+:)) - {-# INLINE showbPrec #-} - --- TODO: Derive with TH once it can detect higher-kinded types properly -instance (Show (f p), Show (g p)) => Show ((f :*: g) p) where - showbPrec = $(mkShowbPrec ''(:*:)) - {-# INLINE showbPrec #-} - --- TODO: Derive with TH once it can detect higher-kinded types properly -instance Show (f (g p)) => Show ((f :.: g) p) where - showbPrec = $(mkShowbPrec ''(:.:)) - {-# INLINE showbPrec #-} - -$(deriveShowPragmas defaultInlineShowbPrec ''Fixity) -$(deriveShowPragmas defaultInlineShowb ''Associativity) -$(deriveShowPragmas defaultInlineShowbPrec ''Arity) +{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.Generics+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for generics-related data types.+This module only exports functions if the compiler supports generics+(on GHC, 7.2 or above).++/Since: 0.3/+-}+module Text.Show.Text.GHC.Generics (+#if __GLASGOW_HASKELL__ < 702+ ) where+#else+ showbU1+ , showbPar1Prec+ , showbRec1Prec+ , showbK1Prec+ , showbM1Prec+ , showbSumTypePrec+ , showbProductTypePrec+ , showbCompFunctorsPrec+ , showbFixityPrec+ , showbAssociativity+ , showbArityPrec+ ) where++import Data.Text.Lazy.Builder (Builder)++import GHC.Generics (U1(..), Par1, Rec1(..), K1(..),+ M1(..), (:+:)(..), (:*:)(..), (:.:)(..),+ Fixity, Associativity, Arity)++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), Show1(showbPrec1))+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowb,+ defaultInlineShowbPrec, mkShowbPrec)++# include "inline.h"++-- | Convert a 'U1' value to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbU1 :: U1 p -> Builder+showbU1 = showb+{-# INLINE showbU1 #-}++-- | Convert a 'Par1' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbPar1Prec :: Show p => Int -> Par1 p -> Builder+showbPar1Prec = showbPrec+{-# INLINE showbPar1Prec #-}++-- | Convert a 'Rec1' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbRec1Prec :: Show (f p) => Int -> Rec1 f p -> Builder+showbRec1Prec = showbPrec+{-# INLINE showbRec1Prec #-}++-- | Convert a 'K1' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbK1Prec :: Show c => Int -> K1 i c p -> Builder+showbK1Prec = showbPrec+{-# INLINE showbK1Prec #-}++-- | Convert an 'M1' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbM1Prec :: Show (f p) => Int -> M1 i c f p -> Builder+showbM1Prec = showbPrec+{-# INLINE showbM1Prec #-}++-- | Convert a '(:+:)' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbSumTypePrec :: (Show (f p), Show (g p)) => Int -> (f :+: g) p -> Builder+showbSumTypePrec = showbPrec+{-# INLINE showbSumTypePrec #-}++-- | Convert a '(:*:)' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbProductTypePrec :: (Show (f p), Show (g p)) => Int -> (f :*: g) p -> Builder+showbProductTypePrec = showbPrec+{-# INLINE showbProductTypePrec #-}++-- | Convert a '(:.:)' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbCompFunctorsPrec :: Show (f (g p)) => Int -> (f :.: g) p -> Builder+showbCompFunctorsPrec = showbPrec+{-# INLINE showbCompFunctorsPrec #-}++-- | Convert a 'Fixity' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbFixityPrec :: Int -> Fixity -> Builder+showbFixityPrec = showbPrec+{-# INLINE showbFixityPrec #-}++-- | Convert an 'Associativity' value to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbAssociativity :: Associativity -> Builder+showbAssociativity = showb+{-# INLINE showbAssociativity #-}++-- | Convert an 'Arity' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbArityPrec :: Int -> Arity -> Builder+showbArityPrec = showbPrec+{-# INLINE showbArityPrec #-}++-- TODO: Derive with TH once it can detect phantom types properly+instance Show (U1 p) where+ showbPrec = $(mkShowbPrec ''U1)+ INLINE_INST_FUN(showb)++instance Show1 U1 where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++$(deriveShowPragmas defaultInlineShowbPrec ''Par1)++instance Show1 Par1 where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++-- TODO: Derive with TH once it can detect higher-kinded types properly+instance Show (f p) => Show (Rec1 f p) where+ showbPrec = $(mkShowbPrec ''Rec1)+ INLINE_INST_FUN(showbPrec)++-- TODO: Derive with TH once it can detect phantom types properly+instance Show c => Show (K1 i c p) where+ showbPrec = $(mkShowbPrec ''K1)+ INLINE_INST_FUN(showbPrec)++-- TODO: Derive with TH once it can detect phantom types properly+instance Show c => Show1 (K1 i c) where+ showbPrec1 = showbPrec+ INLINE_INST_FUN(showbPrec1)++-- TODO: Derive with TH once it can detect phantom types+-- and higher-kinded types properly+instance Show (f p) => Show (M1 i c f p) where+ showbPrec = $(mkShowbPrec ''M1)+ INLINE_INST_FUN(showbPrec)++-- TODO: Derive with TH once it can detect higher-kinded types properly+instance (Show (f p), Show (g p)) => Show ((f :+: g) p) where+ showbPrec = $(mkShowbPrec ''(:+:))+ INLINE_INST_FUN(showbPrec)++-- TODO: Derive with TH once it can detect higher-kinded types properly+instance (Show (f p), Show (g p)) => Show ((f :*: g) p) where+ showbPrec = $(mkShowbPrec ''(:*:))+ INLINE_INST_FUN(showbPrec)++-- TODO: Derive with TH once it can detect higher-kinded types properly+instance Show (f (g p)) => Show ((f :.: g) p) where+ showbPrec = $(mkShowbPrec ''(:.:))+ INLINE_INST_FUN(showbPrec)++$(deriveShowPragmas defaultInlineShowbPrec ''Fixity)+$(deriveShowPragmas defaultInlineShowb ''Associativity)+$(deriveShowPragmas defaultInlineShowbPrec ''Arity)+#endif
src/Text/Show/Text/GHC/RTS/Flags.hs view
@@ -1,239 +1,268 @@-{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.RTS.Flags -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the 'GHC.RTS.Flags' module. -This module is only available with @base-4.8.0.0@ or later. - -/Since: 0.5/ --} -module Text.Show.Text.GHC.RTS.Flags ( - showbRTSFlagsPrec - , showbGCFlagsPrec - , showbConcFlagsPrec - , showbMiscFlagsPrec - , showbDebugFlagsPrec - , showbCCFlagsPrec - , showbProfFlagsPrec - , showbTraceFlagsPrec - , showbTickyFlagsPrec - ) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.RTS.Flags -import GHC.Show (appPrec) - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showb, showbPrec), showbParen, FromStringShow(..)) -import Text.Show.Text.Data.Bool (showbBool) -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.Floating (showbDoublePrec) -import Text.Show.Text.Data.Integral (showbIntPrec, showbWord, showbWord64) -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Maybe (showbMaybePrec) -import Text.Show.Text.Utils ((<>), s) -import Text.Show.Text.TH.Internal (deriveShow) - --- | Convert an 'RTSFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbRTSFlagsPrec :: Int -> RTSFlags -> Builder -showbRTSFlagsPrec = showbPrec -{-# INLINE showbRTSFlagsPrec #-} - --- | Convert a 'GCFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbGCFlagsPrec :: Int -> GCFlags -> Builder -showbGCFlagsPrec p gcfs = showbParen (p > appPrec) $ - "GCFlags {statsFile = " - <> showbMaybePrec 0 (statsFile gcfs) - <> ", giveStats = " - <> showb (FromStringShow $ giveStats gcfs) - <> ", maxStkSize = " - <> showb (maxStkSize gcfs) - <> ", initialStkSize = " - <> showb (initialStkSize gcfs) - <> ", stkChunkSize = " - <> showb (stkChunkSize gcfs) - <> ", stkChunkBufferSize = " - <> showb (stkChunkBufferSize gcfs) - <> ", maxHeapSize = " - <> showb (maxHeapSize gcfs) - <> ", minAllocAreaSize = " - <> showb (minAllocAreaSize gcfs) - <> ", minOldGenSize = " - <> showb (minOldGenSize gcfs) - <> ", heapSizeSuggestion = " - <> showb (heapSizeSuggestion gcfs) - <> ", heapSizeSuggestionAuto = " - <> showbBool (heapSizeSuggestionAuto gcfs) - <> ", oldGenFactor = " - <> showbDoublePrec 0 (oldGenFactor gcfs) - <> ", pcFreeHeap = " - <> showbDoublePrec 0 (pcFreeHeap gcfs) - <> ", generations = " - <> showb (generations gcfs) - <> ", steps = " - <> showb (steps gcfs) - <> ", squeezeUpdFrames = " - <> showbBool (squeezeUpdFrames gcfs) - <> ", compact = " - <> showbBool (compact gcfs) - <> ", compactThreshold = " - <> showbDoublePrec 0 (compactThreshold gcfs) - <> ", sweep = " - <> showbBool (sweep gcfs) - <> ", ringBell = " - <> showbBool (ringBell gcfs) - <> ", frontpanel = " - <> showbBool (frontpanel gcfs) - <> ", idleGCDelayTime = " - <> showbWord64 (idleGCDelayTime gcfs) - <> ", doIdleGC = " - <> showbBool (doIdleGC gcfs) - <> ", heapBase = " - <> showbWord (heapBase gcfs) - <> ", allocLimitGrace = " - <> showbWord (allocLimitGrace gcfs) - <> s '}' - --- | Convert a 'ConcFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbConcFlagsPrec :: Int -> ConcFlags -> Builder -showbConcFlagsPrec = showbPrec -{-# INLINE showbConcFlagsPrec #-} - --- | Convert a 'MiscFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbMiscFlagsPrec :: Int -> MiscFlags -> Builder -showbMiscFlagsPrec = showbPrec -{-# INLINE showbMiscFlagsPrec #-} - --- | Convert a 'DebugFlags' value to a 'Builder' with the given precedence. --- --- /Since: 0.5/ -showbDebugFlagsPrec :: Int -> DebugFlags -> Builder -showbDebugFlagsPrec = showbPrec -{-# INLINE showbDebugFlagsPrec #-} - --- | Convert a 'CCFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbCCFlagsPrec :: Int -> CCFlags -> Builder -showbCCFlagsPrec p ccfs = showbParen (p > appPrec) $ - "CCFlags {doCostCentres = " - <> showb (FromStringShow $ doCostCentres ccfs) - <> ", profilerTicks = " - <> showbIntPrec 0 (profilerTicks ccfs) - <> ", msecsPerTick = " - <> showbIntPrec 0 (msecsPerTick ccfs) - <> s '}' - --- | Convert a 'ProfFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbProfFlagsPrec :: Int -> ProfFlags -> Builder -showbProfFlagsPrec p pfs = showbParen (p > appPrec) $ - "ProfFlags {doHeapProfile = " - <> showb (FromStringShow $ doHeapProfile pfs) - <> ", heapProfileInterval = " - <> showbWord64 (heapProfileInterval pfs) - <> ", heapProfileIntervalTicks = " - <> showbWord (heapProfileIntervalTicks pfs) - <> ", includeTSOs = " - <> showbBool (includeTSOs pfs) - <> ", showCCSOnException = " - <> showbBool (showCCSOnException pfs) - <> ", maxRetainerSetSize = " - <> showbWord (maxRetainerSetSize pfs) - <> ", ccsLength = " - <> showbWord (ccsLength pfs) - <> ", modSelector = " - <> showbMaybePrec 0 (modSelector pfs) - <> ", descrSelector = " - <> showbMaybePrec 0 (descrSelector pfs) - <> ", typeSelector = " - <> showbMaybePrec 0 (typeSelector pfs) - <> ", ccSelector = " - <> showbMaybePrec 0 (ccSelector pfs) - <> ", ccsSelector = " - <> showbMaybePrec 0 (ccsSelector pfs) - <> ", retainerSelector = " - <> showbMaybePrec 0 (retainerSelector pfs) - <> ", bioSelector = " - <> showbMaybePrec 0 (bioSelector pfs) - <> s '}' - --- | Convert a 'TraceFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbTraceFlagsPrec :: Int -> TraceFlags -> Builder -showbTraceFlagsPrec p tfs = showbParen (p > appPrec) $ - "TraceFlags {tracing = " - <> showb (FromStringShow $ tracing tfs) - <> ", timestamp = " - <> showbBool (timestamp tfs) - <> ", traceScheduler = " - <> showbBool (traceScheduler tfs) - <> ", traceGc = " - <> showbBool (traceGc tfs) - <> ", sparksSampled = " - <> showbBool (sparksSampled tfs) - <> ", sparksFull = " - <> showbBool (sparksFull tfs) - <> ", user = " - <> showbBool (user tfs) - <> s '}' - --- | Convert a 'TickyFlags' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbTickyFlagsPrec :: Int -> TickyFlags -> Builder -showbTickyFlagsPrec = showbPrec -{-# INLINE showbTickyFlagsPrec #-} - -$(deriveShow ''RTSFlags) - -instance Show GCFlags where - showbPrec = showbGCFlagsPrec - {-# INLINE showbPrec #-} - -$(deriveShow ''ConcFlags) - -$(deriveShow ''MiscFlags) - -$(deriveShow ''DebugFlags) - -instance Show CCFlags where - showbPrec = showbCCFlagsPrec - {-# INLINE showbPrec #-} - -instance Show ProfFlags where - showbPrec = showbProfFlagsPrec - {-# INLINE showbPrec #-} - -instance Show TraceFlags where - showbPrec = showbTraceFlagsPrec - {-# INLINE showbPrec #-} - -$(deriveShow ''TickyFlags) +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,8,0)+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.RTS.Flags+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the 'GHC.RTS.Flags' module.+This module only exports functions if using @base-4.8.0.0@ or later.++/Since: 0.5/+-}+module Text.Show.Text.GHC.RTS.Flags (+#if !(MIN_VERSION_base(4,8,0))+ ) where+#else+ showbRTSFlagsPrec+ , showbGCFlagsPrec+ , showbConcFlagsPrec+ , showbMiscFlagsPrec+ , showbDebugFlagsPrec+ , showbCCFlagsPrec+ , showbProfFlagsPrec+ , showbTraceFlagsPrec+ , showbTickyFlagsPrec+ ) where++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder)++import GHC.RTS.Flags++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showb, showbPrec), FromStringShow(..))+import Text.Show.Text.Data.Bool (showbBool)+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.Floating (showbDoublePrec)+import Text.Show.Text.Data.Integral (showbIntPrec, showbWord, showbWord64)+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Maybe (showbMaybePrec)+import Text.Show.Text.Utils (s)+import Text.Show.Text.TH.Internal (deriveShow)++# if __GLASGOW_HASKELL__ < 711+import GHC.Show (appPrec)+import Text.Show.Text.Classes (showbParen)+# endif++-- | Convert an 'RTSFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbRTSFlagsPrec :: Int -> RTSFlags -> Builder+showbRTSFlagsPrec = showbPrec+{-# INLINE showbRTSFlagsPrec #-}++-- | Convert a 'GCFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbGCFlagsPrec :: Int -> GCFlags -> Builder+# if __GLASGOW_HASKELL__ >= 711+showbGCFlagsPrec _ gcfs =+# else+showbGCFlagsPrec p gcfs = showbParen (p > appPrec) $+# endif+ "GCFlags {statsFile = "+ <> showbMaybePrec 0 (statsFile gcfs)+ <> ", giveStats = "+ <> showb (FromStringShow $ giveStats gcfs)+ <> ", maxStkSize = "+ <> showb (maxStkSize gcfs)+ <> ", initialStkSize = "+ <> showb (initialStkSize gcfs)+ <> ", stkChunkSize = "+ <> showb (stkChunkSize gcfs)+ <> ", stkChunkBufferSize = "+ <> showb (stkChunkBufferSize gcfs)+ <> ", maxHeapSize = "+ <> showb (maxHeapSize gcfs)+ <> ", minAllocAreaSize = "+ <> showb (minAllocAreaSize gcfs)+ <> ", minOldGenSize = "+ <> showb (minOldGenSize gcfs)+ <> ", heapSizeSuggestion = "+ <> showb (heapSizeSuggestion gcfs)+ <> ", heapSizeSuggestionAuto = "+ <> showbBool (heapSizeSuggestionAuto gcfs)+ <> ", oldGenFactor = "+ <> showbDoublePrec 0 (oldGenFactor gcfs)+ <> ", pcFreeHeap = "+ <> showbDoublePrec 0 (pcFreeHeap gcfs)+ <> ", generations = "+ <> showb (generations gcfs)+ <> ", steps = "+ <> showb (steps gcfs)+ <> ", squeezeUpdFrames = "+ <> showbBool (squeezeUpdFrames gcfs)+ <> ", compact = "+ <> showbBool (compact gcfs)+ <> ", compactThreshold = "+ <> showbDoublePrec 0 (compactThreshold gcfs)+ <> ", sweep = "+ <> showbBool (sweep gcfs)+ <> ", ringBell = "+ <> showbBool (ringBell gcfs)+ <> ", frontpanel = "+ <> showbBool (frontpanel gcfs)+ <> ", idleGCDelayTime = "+ <> showbWord64 (idleGCDelayTime gcfs)+ <> ", doIdleGC = "+ <> showbBool (doIdleGC gcfs)+ <> ", heapBase = "+ <> showbWord (heapBase gcfs)+ <> ", allocLimitGrace = "+ <> showbWord (allocLimitGrace gcfs)+ <> s '}'++-- | Convert a 'ConcFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbConcFlagsPrec :: Int -> ConcFlags -> Builder+showbConcFlagsPrec = showbPrec+{-# INLINE showbConcFlagsPrec #-}++-- | Convert a 'MiscFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbMiscFlagsPrec :: Int -> MiscFlags -> Builder+showbMiscFlagsPrec = showbPrec+{-# INLINE showbMiscFlagsPrec #-}++-- | Convert a 'DebugFlags' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.5/+showbDebugFlagsPrec :: Int -> DebugFlags -> Builder+showbDebugFlagsPrec = showbPrec+{-# INLINE showbDebugFlagsPrec #-}++-- | Convert a 'CCFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbCCFlagsPrec :: Int -> CCFlags -> Builder+# if __GLASGOW_HASKELL__ >= 711+showbCCFlagsPrec _ ccfs =+# else+showbCCFlagsPrec p ccfs = showbParen (p > appPrec) $+# endif+ "CCFlags {doCostCentres = "+ <> showb (FromStringShow $ doCostCentres ccfs)+ <> ", profilerTicks = "+ <> showbIntPrec 0 (profilerTicks ccfs)+ <> ", msecsPerTick = "+ <> showbIntPrec 0 (msecsPerTick ccfs)+ <> s '}'++-- | Convert a 'ProfFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbProfFlagsPrec :: Int -> ProfFlags -> Builder+# if __GLASGOW_HASKELL__ >= 711+showbProfFlagsPrec _ pfs =+# else+showbProfFlagsPrec p pfs = showbParen (p > appPrec) $+# endif+ "ProfFlags {doHeapProfile = "+ <> showb (FromStringShow $ doHeapProfile pfs)+ <> ", heapProfileInterval = "+ <> showbWord64 (heapProfileInterval pfs)+ <> ", heapProfileIntervalTicks = "+ <> showbWord (heapProfileIntervalTicks pfs)+ <> ", includeTSOs = "+ <> showbBool (includeTSOs pfs)+ <> ", showCCSOnException = "+ <> showbBool (showCCSOnException pfs)+ <> ", maxRetainerSetSize = "+ <> showbWord (maxRetainerSetSize pfs)+ <> ", ccsLength = "+ <> showbWord (ccsLength pfs)+ <> ", modSelector = "+ <> showbMaybePrec 0 (modSelector pfs)+ <> ", descrSelector = "+ <> showbMaybePrec 0 (descrSelector pfs)+ <> ", typeSelector = "+ <> showbMaybePrec 0 (typeSelector pfs)+ <> ", ccSelector = "+ <> showbMaybePrec 0 (ccSelector pfs)+ <> ", ccsSelector = "+ <> showbMaybePrec 0 (ccsSelector pfs)+ <> ", retainerSelector = "+ <> showbMaybePrec 0 (retainerSelector pfs)+ <> ", bioSelector = "+ <> showbMaybePrec 0 (bioSelector pfs)+ <> s '}'++-- | Convert a 'TraceFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbTraceFlagsPrec :: Int -> TraceFlags -> Builder+# if __GLASGOW_HASKELL__ >= 711+showbTraceFlagsPrec _ tfs =+# else+showbTraceFlagsPrec p tfs = showbParen (p > appPrec) $+# endif+ "TraceFlags {tracing = "+ <> showb (FromStringShow $ tracing tfs)+ <> ", timestamp = "+ <> showbBool (timestamp tfs)+ <> ", traceScheduler = "+ <> showbBool (traceScheduler tfs)+ <> ", traceGc = "+ <> showbBool (traceGc tfs)+ <> ", sparksSampled = "+ <> showbBool (sparksSampled tfs)+ <> ", sparksFull = "+ <> showbBool (sparksFull tfs)+ <> ", user = "+ <> showbBool (user tfs)+ <> s '}'++-- | Convert a 'TickyFlags' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbTickyFlagsPrec :: Int -> TickyFlags -> Builder+showbTickyFlagsPrec = showbPrec+{-# INLINE showbTickyFlagsPrec #-}++$(deriveShow ''RTSFlags)++instance Show GCFlags where+ showbPrec = showbGCFlagsPrec+ {-# INLINE showbPrec #-}++$(deriveShow ''ConcFlags)++$(deriveShow ''MiscFlags)++$(deriveShow ''DebugFlags)++instance Show CCFlags where+ showbPrec = showbCCFlagsPrec+ {-# INLINE showbPrec #-}++instance Show ProfFlags where+ showbPrec = showbProfFlagsPrec+ {-# INLINE showbPrec #-}++instance Show TraceFlags where+ showbPrec = showbTraceFlagsPrec+ {-# INLINE showbPrec #-}++$(deriveShow ''TickyFlags)+#endif
src/Text/Show/Text/GHC/StaticPtr.hs view
@@ -1,37 +1,47 @@-{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.StaticPtr -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'StaticPtrInfo' values. -This module is only available with @base-4.8.0.0@ or later. - -/Since: 0.5/ --} -module Text.Show.Text.GHC.StaticPtr (showbStaticPtrInfoPrec) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.StaticPtr (StaticPtrInfo) - -import Text.Show.Text.Classes (showbPrec) -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Data.List () -import Text.Show.Text.Data.Tuple () -import Text.Show.Text.TH.Internal (deriveShow) - --- | Conver a 'StaticPtrInfo' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.8.0.0@ or later. --- --- /Since: 0.5/ -showbStaticPtrInfoPrec :: Int -> StaticPtrInfo -> Builder -showbStaticPtrInfoPrec = showbPrec -{-# INLINE showbStaticPtrInfoPrec #-} - -$(deriveShow ''StaticPtrInfo) +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,8,0)+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.StaticPtr+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'StaticPtrInfo' values.+This module only exports functions if using @base-4.8.0.0@ or later.++/Since: 0.5/+-}+module Text.Show.Text.GHC.StaticPtr (+#if !(MIN_VERSION_base(4,8,0))+ ) where+#else+ showbStaticPtrInfoPrec+ ) where++import Data.Text.Lazy.Builder (Builder)++import GHC.StaticPtr (StaticPtrInfo)++import Text.Show.Text.Classes (showbPrec)+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Tuple ()+import Text.Show.Text.TH.Internal (deriveShow)++-- | Conver a 'StaticPtrInfo' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.8.0.0@ or later.+-- +-- /Since: 0.5/+showbStaticPtrInfoPrec :: Int -> StaticPtrInfo -> Builder+showbStaticPtrInfoPrec = showbPrec+{-# INLINE showbStaticPtrInfoPrec #-}++$(deriveShow ''StaticPtrInfo)+#endif
src/Text/Show/Text/GHC/Stats.hs view
@@ -1,35 +1,45 @@-{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.Stats -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'GCStats'. -This module is only available with @base-4.5.0.0@ or later. - -/Since: 0.3/ --} -module Text.Show.Text.GHC.Stats (showbGCStatsPrec) where - -import Data.Text.Lazy.Builder (Builder) - -import GHC.Stats (GCStats) - -import Text.Show.Text.Classes (showbPrec) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Data.Floating () -import Text.Show.Text.TH.Internal (deriveShow) - --- | Convert a 'GCStats' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.5.0.0@ or later. --- --- /Since: 0.3/ -showbGCStatsPrec :: Int -> GCStats -> Builder -showbGCStatsPrec = showbPrec -{-# INLINE showbGCStatsPrec #-} - +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,5,0)+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.Stats+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'GCStats'.+This module only exports functions if using @base-4.5.0.0@ or later.++/Since: 0.3/+-}+module Text.Show.Text.GHC.Stats (+#if !(MIN_VERSION_base(4,5,0))+ ) where+#else+ showbGCStatsPrec+ ) where ++import Data.Text.Lazy.Builder (Builder)++import GHC.Stats (GCStats)++import Text.Show.Text.Classes (showbPrec)+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Data.Floating ()+import Text.Show.Text.TH.Internal (deriveShow)++-- | Convert a 'GCStats' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.5.0.0@ or later.+-- +-- /Since: 0.3/+showbGCStatsPrec :: Int -> GCStats -> Builder+showbGCStatsPrec = showbPrec+{-# INLINE showbGCStatsPrec #-}+ $(deriveShow ''GCStats)+#endif
src/Text/Show/Text/GHC/TypeLits.hs view
@@ -1,105 +1,125 @@-{-# LANGUAGE CPP #-} -#if !(MIN_VERSION_base(4,7,0)) -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE PolyKinds #-} -{-# LANGUAGE UndecidableInstances #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.GHC.TypeLits -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for data types in the @GHC.TypeLits@ module. -This module is only available with @base-4.6.0.0@ or later. - -/Since: 0.5/ --} -module Text.Show.Text.GHC.TypeLits ( -#if MIN_VERSION_base(4,7,0) - showbSomeNatPrec - , showbSomeSymbol -#else - showbIsEven - , showbIsZero -#endif - ) where - -import Data.Text.Lazy.Builder (Builder) -import Prelude hiding (Show) -import Text.Show.Text.Classes (Show(showb, showbPrec)) - -#if MIN_VERSION_base(4,7,0) -import GHC.TypeLits (SomeNat(..), SomeSymbol(..), natVal, symbolVal) -import Text.Show.Text.Data.Char (showbString) -import Text.Show.Text.Data.Integral (showbIntegerPrec) -#else -import GHC.TypeLits (IsEven(..), IsZero(..), Kind, Sing, SingE(fromSing)) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Utils ((<>), s) -#endif - -#if MIN_VERSION_base(4,7,0) --- | Convert a 'SomeNat' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.5/ -showbSomeNatPrec :: Int -> SomeNat -> Builder -showbSomeNatPrec p (SomeNat x) = showbIntegerPrec p $ natVal x -{-# INLINE showbSomeNatPrec #-} - --- | Convert a 'SomeSymbol' value to a 'Builder' with the given precedence. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.5/ -showbSomeSymbol :: SomeSymbol -> Builder -showbSomeSymbol (SomeSymbol x) = showbString $ symbolVal x -{-# INLINE showbSomeSymbol #-} -#else --- | Convert an 'IsEven' value to a 'Builder'. --- This function is only available with @base-4.6@. --- --- /Since: 0.5/ -showbIsEven :: IsEven n -> Builder -showbIsEven IsEvenZero = s '0' -showbIsEven (IsEven x) = "(2 * " <> showb x <> s ')' -showbIsEven (IsOdd x) = "(2 * " <> showb x <> " + 1)" -{-# INLINE showbIsEven #-} - --- | Convert an 'IsZero' value to a 'Builder'. --- This function is only available with @base-4.6@. --- --- /Since: 0.5/ -showbIsZero :: IsZero n -> Builder -showbIsZero IsZero = s '0' -showbIsZero (IsSucc n) = s '(' <> showb n <> " + 1)" -{-# INLINE showbIsZero #-} -#endif - -#if MIN_VERSION_base(4,7,0) -instance Show SomeNat where - showbPrec = showbSomeNatPrec - {-# INLINE showbPrec #-} - -instance Show SomeSymbol where - showb = showbSomeSymbol - {-# INLINE showb #-} -#else -instance Show (IsEven n) where - showb = showbIsEven - {-# INLINE showb #-} - -instance Show (IsZero n) where - showb = showbIsZero - {-# INLINE showb #-} - -instance (SingE (Kind :: k) rep, Show rep) => Show (Sing (a :: k)) where - showbPrec p = showbPrec p . fromSing - {-# INLINE showbPrec #-} -#endif +{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,6,0)+# if !(MIN_VERSION_base(4,7,0))+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE UndecidableInstances #-}+# endif++{-# OPTIONS_GHC -fno-warn-orphans #-}+#endif+{-|+Module: Text.Show.Text.GHC.TypeLits+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for data types in the @GHC.TypeLits@ module.+This module only exports functions if using @base-4.6.0.0@ or later.++/Since: 0.5/+-}+module Text.Show.Text.GHC.TypeLits (+#if MIN_VERSION_base(4,7,0)+ showbSomeNatPrec+ , showbSomeSymbol+ ) where+#elif MIN_VERSION_base(4,6,0)+ showbIsEven+ , showbIsZero+ , showbSingPrec+ ) where+#else+ ) where+#endif++#if MIN_VERSION_base(4,6,0)++import Data.Text.Lazy.Builder (Builder)+import Prelude hiding (Show)+import Text.Show.Text.Classes (Show(showb, showbPrec))++# if MIN_VERSION_base(4,7,0)+import GHC.TypeLits (SomeNat(..), SomeSymbol(..), natVal, symbolVal)+import Text.Show.Text.Data.Char (showbString)+import Text.Show.Text.Data.Integral (showbIntegerPrec)+# else+import Data.Monoid.Compat ((<>))+import GHC.TypeLits (IsEven(..), IsZero(..), Kind, Sing, SingE(fromSing))+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Utils (s)+# endif++# if MIN_VERSION_base(4,7,0)+-- | Convert a 'SomeNat' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.5/+showbSomeNatPrec :: Int -> SomeNat -> Builder+showbSomeNatPrec p (SomeNat x) = showbIntegerPrec p $ natVal x+{-# INLINE showbSomeNatPrec #-}++-- | Convert a 'SomeSymbol' value to a 'Builder' with the given precedence.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.5/+showbSomeSymbol :: SomeSymbol -> Builder+showbSomeSymbol (SomeSymbol x) = showbString $ symbolVal x+{-# INLINE showbSomeSymbol #-}+# else+-- | Convert an 'IsEven' value to a 'Builder'.+-- This function is only available with @base-4.6@.+-- +-- /Since: 0.5/+showbIsEven :: IsEven n -> Builder+showbIsEven IsEvenZero = s '0'+showbIsEven (IsEven x) = "(2 * " <> showb x <> s ')'+showbIsEven (IsOdd x) = "(2 * " <> showb x <> " + 1)"+{-# INLINE showbIsEven #-}++-- | Convert an 'IsZero' value to a 'Builder'.+-- This function is only available with @base-4.6@.+-- +-- /Since: 0.5/+showbIsZero :: IsZero n -> Builder+showbIsZero IsZero = s '0'+showbIsZero (IsSucc n) = s '(' <> showb n <> " + 1)"+{-# INLINE showbIsZero #-}++-- | Convert a 'Sing' value to a 'Builder' with the given precedence.+-- +-- /Since: 0.8/+showbSingPrec :: (SingE (Kind :: k) rep, Show rep) => Int -> Sing (a :: k) -> Builder+showbSingPrec p = showbPrec p . fromSing+{-# INLINE showbSingPrec #-}+# endif++# if MIN_VERSION_base(4,7,0)+instance Show SomeNat where+ showbPrec = showbSomeNatPrec+ {-# INLINE showbPrec #-}++instance Show SomeSymbol where+ showb = showbSomeSymbol+ {-# INLINE showb #-}+# else+instance Show (IsEven n) where+ showb = showbIsEven+ {-# INLINE showb #-}++instance Show (IsZero n) where+ showb = showbIsZero+ {-# INLINE showb #-}++instance (SingE (Kind :: k) rep, Show rep) => Show (Sing (a :: k)) where+ showbPrec = showbSingPrec+ {-# INLINE showbPrec #-}+# endif++#endif
src/Text/Show/Text/Generic.hs view
@@ -1,318 +1,343 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TypeOperators #-} -#if __GLASGOW_HASKELL__ >= 708 -{-# LANGUAGE StandaloneDeriving #-} -#endif -{-| -Module: Text.Show.Text.Generic -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Generic versions of 'Show' class functions, as an alternative to "Text.Show.Text.TH", -which uses Template Haskell. This module is only available if the compiler supports -generics (on GHC, 7.2 or above). - -This implementation is based off of the @Generics.Deriving.Show@ module from the -@generic-deriving@ library. - -/Since: 0.6/ --} -module Text.Show.Text.Generic ( - -- * Generic @show@ functions - -- $generics - - -- ** Understanding a compiler error - -- $generic_err - genericShow - , genericShowLazy - , genericShowPrec - , genericShowPrecLazy - , genericShowList - , genericShowListLazy - , genericShowb - , genericShowbPrec - , genericShowbList - , genericPrint - , genericPrintLazy - , genericHPrint - , genericHPrintLazy - -- * The 'GShow' class - , GShow(..) - , ConType(..) - ) where - -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (mempty) -#endif -import qualified Data.Text as TS (Text) -import qualified Data.Text.IO as TS (putStrLn, hPutStrLn) -import Data.Text.Lazy (toStrict) -import Data.Text.Lazy.Builder (Builder, fromString, toLazyText) -import qualified Data.Text.Lazy as TL (Text) -import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn) -import Data.Typeable (Typeable) - -import GHC.Generics -import GHC.Show (appPrec, appPrec1) - -import Prelude hiding (Show) - -import System.IO (Handle) - -import qualified Text.Show as S (Show) -import qualified Text.Show.Text.Classes as T -import Text.Show.Text.Classes (Show(showbPrec), showbListWith, - showbParen, showbSpace) -import Text.Show.Text.Instances () -import Text.Show.Text.Utils ((<>), isInfixTypeCon, isTupleString, - s, toString) - -#include "inline.h" - -{- $generics - -'T.Show' instances can be easily defined for data types that are 'Generic' instances. -The easiest way to do this is to use the @DeriveGeneric@ extension. - -@ -{-# LANGUAGE DeriveGeneric #-} -import Text.Show.Text -import Text.Show.Generic (genericShowbPrec) - -data D a = Nullary - | Unary Int - | Product String Char a - | Record { testOne :: Double - , testTwo :: Bool - , testThree :: D a - } - -instance Show a => Show (D a) where - showbPrec = 'genericShowbPrec' -@ - -@D@ now has a 'T.Show' instance analogous to what would be generated by a -@deriving Show@ clause. - --} - -{- $generic_err - -Suppose you intend to tuse 'genericShowbPrec' to define a 'T.Show' instance. - -@ -data Oops = Oops - -- forgot to add \"deriving Generic\" here! - -instance Show Oops where - showbPrec = 'genericShowbPrec' -@ - -If you forget to add a @deriving 'Generic'@ clause to your data type, at -compile-time, you will get an error message that begins roughly as follows: - -@ -No instance for ('GShow' (Rep Oops)) -@ - -This error can be confusing, but don't let it intimidate you. The correct fix is -simply to add the missing \"@deriving 'Generic'@\" clause. --} - --- | A 'Generic' implementation of 'T.show'. --- --- /Since: 0.6/ -genericShow :: (Generic a, GShow (Rep a)) => a -> TS.Text -genericShow = toStrict . genericShowLazy - --- | A 'Generic' implementation of 'T.showLazy'. --- --- /Since: 0.6/ -genericShowLazy :: (Generic a, GShow (Rep a)) => a -> TL.Text -genericShowLazy = toLazyText . genericShowb - --- | A 'Generic' implementation of 'T.showPrec'. --- --- /Since: 0.6/ -genericShowPrec :: (Generic a, GShow (Rep a)) => Int -> a -> TS.Text -genericShowPrec p = toStrict . genericShowPrecLazy p - --- | A 'Generic' implementation of 'T.showPrecLazy'. --- --- /Since: 0.6/ -genericShowPrecLazy :: (Generic a, GShow (Rep a)) => Int -> a -> TL.Text -genericShowPrecLazy p = toLazyText . genericShowbPrec p - --- | A 'Generic' implementation of 'T.showList'. --- --- /Since: 0.6/ -genericShowList :: (Generic a, GShow (Rep a)) => [a] -> TS.Text -genericShowList = toStrict . genericShowListLazy - --- | A 'Generic' implementation of 'T.showListLazy'. --- --- /Since: 0.6/ -genericShowListLazy :: (Generic a, GShow (Rep a)) => [a] -> TL.Text -genericShowListLazy = toLazyText . genericShowbList - --- | A 'Generic' implementation of 'T.showb'. --- --- /Since: 0.6/ -genericShowb :: (Generic a, GShow (Rep a)) => a -> Builder -genericShowb = genericShowbPrec 0 - --- | A 'Generic' implementation of 'T.showbPrec'. --- --- /Since: 0.6/ -genericShowbPrec :: (Generic a, GShow (Rep a)) => Int -> a -> Builder -genericShowbPrec p = gShowbPrec Pref p . from - --- | A 'Generic' implementation of 'T.showbList'. --- --- /Since: 0.6/ -genericShowbList :: (Generic a, GShow (Rep a)) => [a] -> Builder -genericShowbList = showbListWith genericShowb - --- | A 'Generic' implementation of 'T.print'. --- --- /Since: 0.6/ -genericPrint :: (Generic a, GShow (Rep a)) => a -> IO () -genericPrint = TS.putStrLn . genericShow - --- | A 'Generic' implementation of 'T.printLazy'. --- --- /Since: 0.6/ -genericPrintLazy :: (Generic a, GShow (Rep a)) => a -> IO () -genericPrintLazy = TL.putStrLn . genericShowLazy - --- | A 'Generic' implementation of 'T.hPrint'. --- --- /Since: 0.6/ -genericHPrint :: (Generic a, GShow (Rep a)) => Handle -> a -> IO () -genericHPrint h = TS.hPutStrLn h . genericShow - --- | A 'Generic' implementation of 'T.hPrintLazy'. --- --- /Since: 0.6/ -genericHPrintLazy :: (Generic a, GShow (Rep a)) => Handle -> a -> IO () -genericHPrintLazy h = TL.hPutStrLn h . genericShowLazy - --- | Whether a constructor is a record ('Rec'), a tuple ('Tup'), is prefix ('Pref'), --- or infix ('Inf'). --- --- /Since: 0.6/ -data ConType = Rec | Tup | Pref | Inf Builder - deriving ( Generic - , S.Show - , Typeable -#if MIN_VERSION_text(0,11,1) - , Eq - , Ord -#endif - ) - -instance T.Show ConType where - showbPrec = genericShowbPrec - INLINE_INST_FUN(showbPrec) - --- | Class of generic representation types ('Rep') that can be converted to --- a 'Builder'. --- --- /Since: 0.6/ -class GShow f where - -- This function is used as the default generic implementation of 'showbPrec'. - gShowbPrec :: ConType -> Int -> f a -> Builder - -- Whether a representation type has any constructors. - isNullary :: f a -> Bool - isNullary = error "generic show (isNullary): unnecessary case" - -#if __GLASGOW_HASKELL__ >= 708 -deriving instance Typeable GShow -#endif - -instance GShow U1 where - gShowbPrec _ _ U1 = mempty - isNullary _ = True - -instance T.Show c => GShow (K1 i c) where - gShowbPrec _ n (K1 a) = showbPrec n a - isNullary _ = False - -instance (Constructor c, GShow a) => GShow (M1 C c a) where - gShowbPrec _ n c@(M1 x) = case fixity of - Prefix -> showbParen (n > appPrec && not (isNullary x || conIsTuple c)) $ - (if (conIsTuple c) then mempty else fromString (conName c)) - <> (if (isNullary x || conIsTuple c) then mempty else s ' ') - <> (showbBraces t (gShowbPrec t appPrec1 x)) - Infix _ m -> showbParen (n > m) . showbBraces t $ gShowbPrec t (m+1) x - where - fixity :: Fixity - fixity = conFixity c - - t :: ConType - t = if (conIsRecord c) - then Rec - else case conIsTuple c of - True -> Tup - False -> case fixity of - Prefix -> Pref - Infix _ _ -> Inf . fromString $ conName c - - showbBraces :: ConType -> Builder -> Builder - showbBraces Rec b = s '{' <> b <> s '}' - showbBraces Tup b = s '(' <> b <> s ')' - showbBraces Pref b = b - showbBraces (Inf _) b = b - - conIsTuple :: M1 C c a b -> Bool - conIsTuple = isTupleString . conName - -instance (Selector s, GShow a) => GShow (M1 S s a) where - gShowbPrec t n sel@(M1 x) - | selName sel == "" = gShowbPrec t n x - | otherwise = fromString (selName sel) <> " = " <> gShowbPrec t 0 x - isNullary (M1 x) = isNullary x - -instance GShow a => GShow (M1 D d a) where - gShowbPrec t n (M1 x) = gShowbPrec t n x - -instance (GShow a, GShow b) => GShow (a :+: b) where - gShowbPrec t n (L1 x) = gShowbPrec t n x - gShowbPrec t n (R1 x) = gShowbPrec t n x - -instance (GShow a, GShow b) => GShow (a :*: b) where - gShowbPrec t@Rec _ (a :*: b) = - gShowbPrec t 0 a - <> ", " - <> gShowbPrec t 0 b - gShowbPrec t@(Inf o) n (a :*: b) = - gShowbPrec t n a - <> showbSpace - <> infixOp - <> showbSpace - <> gShowbPrec t n b - where - infixOp :: Builder - infixOp = if isInfixTypeCon (toString o) - then o - else s '`' <> o <> s '`' - gShowbPrec t@Tup _ (a :*: b) = - gShowbPrec t 0 a - <> s ',' - <> gShowbPrec t 0 b - gShowbPrec t@Pref n (a :*: b) = - gShowbPrec t n a - <> showbSpace - <> gShowbPrec t n b - - -- If we have a product then it is not a nullary constructor - isNullary _ = False +{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}+#endif++#if __GLASGOW_HASKELL__ >= 706+{-# LANGUAGE PolyKinds #-}+#endif++#if __GLASGOW_HASKELL__ >= 708+{-# LANGUAGE StandaloneDeriving #-}+#endif+{-|+Module: Text.Show.Text.Generic+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Generic versions of 'Show' class functions, as an alternative to "Text.Show.Text.TH",+which uses Template Haskell. This module only exports functions if the compiler+supports generics (on GHC, 7.2 or above).++This implementation is based off of the @Generics.Deriving.Show@ module from the+@generic-deriving@ library.++/Since: 0.6/+-}+module Text.Show.Text.Generic (+#if __GLASGOW_HASKELL__ < 702+ ) where+#else+ -- * Generic @show@ functions+ -- $generics+ + -- ** Understanding a compiler error+ -- $generic_err+ genericShow+ , genericShowLazy+ , genericShowPrec+ , genericShowPrecLazy+ , genericShowList+ , genericShowListLazy+ , genericShowb+ , genericShowbPrec+ , genericShowbList+ , genericPrint+ , genericPrintLazy+ , genericHPrint+ , genericHPrintLazy+ -- * The 'GShow' class+ , GShow(..)+ , ConType(..)+ ) where++import Data.Monoid.Compat ((<>))+import qualified Data.Text as TS (Text)+import qualified Data.Text.IO as TS (putStrLn, hPutStrLn)+import Data.Text.Lazy (toStrict)+import Data.Text.Lazy.Builder (Builder, fromString, toLazyText)+import qualified Data.Text.Lazy as TL (Text)+import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn)+import Data.Typeable (Typeable)++import GHC.Generics+import GHC.Show (appPrec, appPrec1)++import Prelude ()+import Prelude.Compat hiding (Show)++import System.IO (Handle)++import qualified Text.Show as S (Show)+import qualified Text.Show.Text.Classes as T+import Text.Show.Text.Classes (Show(showbPrec), showbListWith,+ showbParen, showbSpace)+import Text.Show.Text.Instances ()+import Text.Show.Text.Utils (isInfixTypeCon, isTupleString, s, toString)++# include "inline.h"++{- $generics++'T.Show' instances can be easily defined for data types that are 'Generic' instances.+The easiest way to do this is to use the @DeriveGeneric@ extension.++@+{-# LANGUAGE DeriveGeneric #-}+import Text.Show.Text+import Text.Show.Generic (genericShowbPrec)++data D a = Nullary+ | Unary Int+ | Product String Char a+ | Record { testOne :: Double+ , testTwo :: Bool+ , testThree :: D a+ }++instance Show a => Show (D a) where+ showbPrec = 'genericShowbPrec'+@++@D@ now has a 'T.Show' instance analogous to what would be generated by a+@deriving Show@ clause.++-}++{- $generic_err++Suppose you intend to tuse 'genericShowbPrec' to define a 'T.Show' instance.++@+data Oops = Oops+ -- forgot to add \"deriving Generic\" here!++instance Show Oops where+ showbPrec = 'genericShowbPrec'+@++If you forget to add a @deriving 'Generic'@ clause to your data type, at+compile-time, you will get an error message that begins roughly as follows:++@+No instance for ('GShow' (Rep Oops))+@++This error can be confusing, but don't let it intimidate you. The correct fix is+simply to add the missing \"@deriving 'Generic'@\" clause.+-}++-- | A 'Generic' implementation of 'T.show'.+-- +-- /Since: 0.6/+genericShow :: (Generic a, GShow (Rep a)) => a -> TS.Text+genericShow = toStrict . genericShowLazy++-- | A 'Generic' implementation of 'T.showLazy'.+-- +-- /Since: 0.6/+genericShowLazy :: (Generic a, GShow (Rep a)) => a -> TL.Text+genericShowLazy = toLazyText . genericShowb++-- | A 'Generic' implementation of 'T.showPrec'.+-- +-- /Since: 0.6/+genericShowPrec :: (Generic a, GShow (Rep a)) => Int -> a -> TS.Text+genericShowPrec p = toStrict . genericShowPrecLazy p++-- | A 'Generic' implementation of 'T.showPrecLazy'.+-- +-- /Since: 0.6/+genericShowPrecLazy :: (Generic a, GShow (Rep a)) => Int -> a -> TL.Text+genericShowPrecLazy p = toLazyText . genericShowbPrec p++-- | A 'Generic' implementation of 'T.showList'.+-- +-- /Since: 0.6/+genericShowList :: (Generic a, GShow (Rep a)) => [a] -> TS.Text+genericShowList = toStrict . genericShowListLazy++-- | A 'Generic' implementation of 'T.showListLazy'.+-- +-- /Since: 0.6/+genericShowListLazy :: (Generic a, GShow (Rep a)) => [a] -> TL.Text+genericShowListLazy = toLazyText . genericShowbList++-- | A 'Generic' implementation of 'T.showb'.+-- +-- /Since: 0.6/+genericShowb :: (Generic a, GShow (Rep a)) => a -> Builder+genericShowb = genericShowbPrec 0++-- | A 'Generic' implementation of 'T.showbPrec'.+-- +-- /Since: 0.6/+genericShowbPrec :: (Generic a, GShow (Rep a)) => Int -> a -> Builder+genericShowbPrec p = gShowbPrec Pref p . from++-- | A 'Generic' implementation of 'T.showbList'.+-- +-- /Since: 0.6/+genericShowbList :: (Generic a, GShow (Rep a)) => [a] -> Builder+genericShowbList = showbListWith genericShowb++-- | A 'Generic' implementation of 'T.print'.+-- +-- /Since: 0.6/+genericPrint :: (Generic a, GShow (Rep a)) => a -> IO ()+genericPrint = TS.putStrLn . genericShow++-- | A 'Generic' implementation of 'T.printLazy'.+-- +-- /Since: 0.6/+genericPrintLazy :: (Generic a, GShow (Rep a)) => a -> IO ()+genericPrintLazy = TL.putStrLn . genericShowLazy++-- | A 'Generic' implementation of 'T.hPrint'.+-- +-- /Since: 0.6/+genericHPrint :: (Generic a, GShow (Rep a)) => Handle -> a -> IO ()+genericHPrint h = TS.hPutStrLn h . genericShow++-- | A 'Generic' implementation of 'T.hPrintLazy'.+-- +-- /Since: 0.6/+genericHPrintLazy :: (Generic a, GShow (Rep a)) => Handle -> a -> IO ()+genericHPrintLazy h = TL.hPutStrLn h . genericShowLazy++-- | Whether a constructor is a record ('Rec'), a tuple ('Tup'), is prefix ('Pref'),+-- or infix ('Inf').+-- +-- /Since: 0.6/+data ConType = Rec | Tup | Pref | Inf Builder+ deriving ( Generic+ , S.Show+ , Typeable+# if MIN_VERSION_text(0,11,1)+ , Eq+ , Ord+# endif+ )++instance T.Show ConType where+ showbPrec = genericShowbPrec+ INLINE_INST_FUN(showbPrec)++-- | Class of generic representation types ('Rep') that can be converted to+-- a 'Builder'.+-- +-- /Since: 0.6/+class GShow f where+ -- | This is used as the default generic implementation of 'showbPrec'.+ gShowbPrec :: ConType -> Int -> f a -> Builder+ -- | Whether a representation type has any constructors.+ isNullary :: f a -> Bool+ isNullary = error "generic show (isNullary): unnecessary case"+# if __GLASGOW_HASKELL__ >= 708+ {-# MINIMAL gShowbPrec #-}++deriving instance Typeable GShow+# endif++instance GShow U1 where+ gShowbPrec _ _ U1 = mempty+ isNullary _ = True++instance T.Show c => GShow (K1 i c) where+ gShowbPrec _ n (K1 a) = showbPrec n a+ isNullary _ = False++instance (Constructor c, GShow a) => GShow (M1 C c a) where+ gShowbPrec _ n c@(M1 x) = case fixity of+ Prefix -> showbParen ( n > appPrec+ && not ( isNullary x+ || conIsTuple c+# if __GLASGOW_HASKELL__ >= 711+ || conIsRecord c+# endif+ )+ ) $+ (if conIsTuple c+ then mempty+ else let cn = conName c+ in showbParen (isInfixTypeCon cn) $ fromString cn+ )+ <> (if isNullary x || conIsTuple c+ then mempty+ else s ' '+ )+ <> showbBraces t (gShowbPrec t appPrec1 x)+ Infix _ m -> showbParen (n > m) . showbBraces t $ gShowbPrec t (m+1) x+ where+ fixity :: Fixity+ fixity = conFixity c+ + t :: ConType+ t = if conIsRecord c+ then Rec+ else case conIsTuple c of+ True -> Tup+ False -> case fixity of+ Prefix -> Pref+ Infix _ _ -> Inf . fromString $ conName c+ + showbBraces :: ConType -> Builder -> Builder+ showbBraces Rec b = s '{' <> b <> s '}'+ showbBraces Tup b = s '(' <> b <> s ')'+ showbBraces Pref b = b+ showbBraces (Inf _) b = b+ + conIsTuple :: M1 C c a b -> Bool+ conIsTuple = isTupleString . conName++instance (Selector s, GShow a) => GShow (M1 S s a) where+ gShowbPrec t n sel@(M1 x)+ | selName sel == "" = gShowbPrec t n x+ | otherwise = fromString (selName sel) <> " = " <> gShowbPrec t 0 x+ isNullary (M1 x) = isNullary x++instance GShow a => GShow (M1 D d a) where+ gShowbPrec t n (M1 x) = gShowbPrec t n x++instance (GShow a, GShow b) => GShow (a :+: b) where+ gShowbPrec t n (L1 x) = gShowbPrec t n x+ gShowbPrec t n (R1 x) = gShowbPrec t n x++instance (GShow a, GShow b) => GShow (a :*: b) where+ gShowbPrec t@Rec _ (a :*: b) =+ gShowbPrec t 0 a+ <> ", "+ <> gShowbPrec t 0 b+ gShowbPrec t@(Inf o) n (a :*: b) =+ gShowbPrec t n a+ <> showbSpace+ <> infixOp+ <> showbSpace+ <> gShowbPrec t n b+ where+ infixOp :: Builder+ infixOp = if isInfixTypeCon (toString o)+ then o+ else s '`' <> o <> s '`'+ gShowbPrec t@Tup _ (a :*: b) =+ gShowbPrec t 0 a+ <> s ','+ <> gShowbPrec t 0 b+ gShowbPrec t@Pref n (a :*: b) =+ gShowbPrec t n a+ <> showbSpace+ <> gShowbPrec t n b+ + -- If we have a product then it is not a nullary constructor+ isNullary _ = False+#endif
src/Text/Show/Text/Instances.hs view
@@ -1,19 +1,64 @@-{-| -Module: Text.Show.Text.Instances -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for all data types covered by @text-show@. --} -module Text.Show.Text.Instances () where - -import Text.Show.Text.Control () -import Text.Show.Text.Data () -import Text.Show.Text.Foreign () -import Text.Show.Text.GHC () -import Text.Show.Text.Numeric () -import Text.Show.Text.System () -import Text.Show.Text.Text () +{-|+Module: Text.Show.Text.Instances+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Imports all orphan 'Show' instance covered by @text-show@ (except for the instance+in `Text.Show.Text.Functions`, which is not imported by default).+-}+module Text.Show.Text.Instances () where++import Text.Show.Text.Control.Applicative ()+import Text.Show.Text.Control.Concurrent ()+import Text.Show.Text.Control.Exception ()+import Text.Show.Text.Control.Monad.ST ()++import Text.Show.Text.Data.Array ()+import Text.Show.Text.Data.Bool ()+import Text.Show.Text.Data.ByteString ()+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.Complex ()+import Text.Show.Text.Data.Data ()+import Text.Show.Text.Data.Dynamic ()+import Text.Show.Text.Data.Either ()+import Text.Show.Text.Data.Fixed ()+import Text.Show.Text.Data.Floating ()+import Text.Show.Text.Data.Functor.Identity ()+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Data.List ()+import Text.Show.Text.Data.Maybe ()+import Text.Show.Text.Data.Monoid ()+import Text.Show.Text.Data.OldTypeable ()+import Text.Show.Text.Data.Ord ()+import Text.Show.Text.Data.Proxy ()+import Text.Show.Text.Data.Ratio ()+import Text.Show.Text.Data.Text ()+import Text.Show.Text.Data.Tuple ()+import Text.Show.Text.Data.Type.Coercion ()+import Text.Show.Text.Data.Type.Equality ()+import Text.Show.Text.Data.Typeable ()+import Text.Show.Text.Data.Version ()+import Text.Show.Text.Data.Void ()++import Text.Show.Text.Foreign.C.Types ()+import Text.Show.Text.Foreign.Ptr ()++import Text.Show.Text.GHC.Conc.Windows ()+import Text.Show.Text.GHC.Event ()+import Text.Show.Text.GHC.Fingerprint ()+import Text.Show.Text.GHC.Generics ()+import Text.Show.Text.GHC.RTS.Flags ()+import Text.Show.Text.GHC.StaticPtr ()+import Text.Show.Text.GHC.Stats ()+import Text.Show.Text.GHC.TypeLits ()++import Text.Show.Text.Numeric.Natural ()++import Text.Show.Text.System.Exit ()+import Text.Show.Text.System.IO ()+import Text.Show.Text.System.Posix.Types ()++import Text.Show.Text.Text.Read ()
− src/Text/Show/Text/Numeric.hs
@@ -1,13 +0,0 @@-{-| -Module: Text.Show.Text.Numeric -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @Numeric@ modules. --} -module Text.Show.Text.Numeric () where - -import Text.Show.Text.Numeric.Natural ()
src/Text/Show/Text/Numeric/Natural.hs view
@@ -1,53 +1,53 @@-{-# LANGUAGE CPP #-} -#if MIN_VERSION_base(4,8,0) -{-# LANGUAGE MagicHash #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Numeric.Natural -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Natural's. - -/Since: 0.5/ --} -module Text.Show.Text.Numeric.Natural (showbNaturalPrec) where - -import Data.Text.Lazy.Builder (Builder) - -#if MIN_VERSION_base(4,8,0) -import GHC.Integer.GMP.Internals (Integer(..)) -import GHC.Natural (Natural(..)) -import GHC.Types (Word(..)) - -import Text.Show.Text.Data.Integral (showbWord) -#else -import Numeric.Natural (Natural) -#endif - -import Prelude hiding (Show) - -import Text.Show.Text.Classes (Show(showbPrec)) -import Text.Show.Text.Data.Integral (showbIntegerPrec) - -#include "inline.h" - --- | Convert a 'Natural' to a 'Builder' with the given precedence. --- --- /Since: 0.5/ -showbNaturalPrec :: Int -> Natural -> Builder -#if MIN_VERSION_base(4,8,0) -showbNaturalPrec _ (NatS# w#) = showbWord $ W# w# -showbNaturalPrec p (NatJ# bn) = showbIntegerPrec p $ Jp# bn -#else -showbNaturalPrec p = showbIntegerPrec p . toInteger -{-# INLINE showbNaturalPrec #-} -#endif - -instance Show Natural where - showbPrec = showbNaturalPrec - INLINE_INST_FUN(showbPrec) +{-# LANGUAGE CPP #-}+#if MIN_VERSION_base(4,8,0)+{-# LANGUAGE MagicHash #-}+#endif+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Numeric.Natural+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Natural's.++/Since: 0.5/+-}+module Text.Show.Text.Numeric.Natural (showbNaturalPrec) where++import Data.Text.Lazy.Builder (Builder)++#if MIN_VERSION_base(4,8,0)+import GHC.Integer.GMP.Internals (Integer(..))+import GHC.Natural (Natural(..))+import GHC.Types (Word(..))++import Text.Show.Text.Data.Integral (showbWord)+#else+import Numeric.Natural (Natural)+#endif++import Prelude hiding (Show)++import Text.Show.Text.Classes (Show(showbPrec))+import Text.Show.Text.Data.Integral (showbIntegerPrec)++#include "inline.h"++-- | Convert a 'Natural' to a 'Builder' with the given precedence.+-- +-- /Since: 0.5/+showbNaturalPrec :: Int -> Natural -> Builder+#if MIN_VERSION_base(4,8,0)+showbNaturalPrec _ (NatS# w#) = showbWord $ W# w#+showbNaturalPrec p (NatJ# bn) = showbIntegerPrec p $ Jp# bn+#else+showbNaturalPrec p = showbIntegerPrec p . toInteger+{-# INLINE showbNaturalPrec #-}+#endif++instance Show Natural where+ showbPrec = showbNaturalPrec+ INLINE_INST_FUN(showbPrec)
− src/Text/Show/Text/System.hs
@@ -1,15 +0,0 @@-{-| -Module: Text.Show.Text.System -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @System@ modules. --} -module Text.Show.Text.System () where - -import Text.Show.Text.System.Exit () -import Text.Show.Text.System.IO () -import Text.Show.Text.System.Posix.Types ()
src/Text/Show/Text/System/Exit.hs view
@@ -1,32 +1,32 @@-{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.System.Exit -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'ExitCode'. - -/Since: 0.3/ --} -module Text.Show.Text.System.Exit (showbExitCodePrec) where - -import Data.Text.Lazy.Builder (Builder) - -import System.Exit (ExitCode) - -import Text.Show.Text.Classes (showbPrec) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec) - --- | Convert an 'ExitCode' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbExitCodePrec :: Int -> ExitCode -> Builder -showbExitCodePrec = showbPrec -{-# INLINE showbExitCodePrec #-} - +{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.System.Exit+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'ExitCode'.++/Since: 0.3/+-}+module Text.Show.Text.System.Exit (showbExitCodePrec) where++import Data.Text.Lazy.Builder (Builder)++import System.Exit (ExitCode)++import Text.Show.Text.Classes (showbPrec)+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.TH.Internal (deriveShowPragmas, defaultInlineShowbPrec)++-- | Convert an 'ExitCode' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbExitCodePrec :: Int -> ExitCode -> Builder+showbExitCodePrec = showbPrec+{-# INLINE showbExitCodePrec #-}+ $(deriveShowPragmas defaultInlineShowbPrec ''ExitCode)
src/Text/Show/Text/System/IO.hs view
@@ -1,168 +1,160 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.System.IO -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'IO'-related data types. - -/Since: 0.3/ --} -module Text.Show.Text.System.IO ( - showbHandle - , showbIOMode - , showbBufferModePrec - , showbHandlePosn - , showbSeekMode -#if MIN_VERSION_base(4,3,0) - , showbTextEncoding -#endif -#if MIN_VERSION_base(4,4,0) - , showbCodingProgress - , showbCodingFailureMode -#endif - , showbNewline - , showbNewlineModePrec - ) where - -import Data.Text.Lazy.Builder (Builder, fromString) - -#include "inline.h" - -#if MIN_VERSION_base(4,3,0) -import GHC.IO.Encoding.Types (TextEncoding(textEncodingName)) -#endif -#if MIN_VERSION_base(4,4,0) -import GHC.IO.Encoding.Failure (CodingFailureMode) -import GHC.IO.Encoding.Types (CodingProgress) -#endif -import GHC.IO.Handle (HandlePosn(..)) -import GHC.IO.Handle.Types (Handle(..)) - -import Prelude hiding (Show) - -import System.IO (BufferMode, IOMode, Newline, NewlineMode, SeekMode) - -import Text.Show.Text.Classes (Show(showb, showbPrec)) -import Text.Show.Text.Data.Integral (showbIntegerPrec) -import Text.Show.Text.Data.Maybe () -import Text.Show.Text.TH.Internal (deriveShow, deriveShowPragmas, - defaultInlineShowb, defaultInlineShowbPrec) -import Text.Show.Text.Utils ((<>), s) - --- | Convert a 'Handle' to a 'Builder'. --- --- /Since: 0.3/ -showbHandle :: Handle -> Builder -showbHandle (FileHandle file _) = showbHandleFilePath file -showbHandle (DuplexHandle file _ _) = showbHandleFilePath file -{-# INLINE showbHandle #-} - --- | Convert a 'Handle`'s 'FilePath' to a 'Builder'. -showbHandleFilePath :: FilePath -> Builder -showbHandleFilePath file = "{handle: " <> fromString file <> s '}' -{-# INLINE showbHandleFilePath #-} - --- | Convert an 'IOMode' to a 'Builder'. --- --- /Since: 0.3/ -showbIOMode :: IOMode -> Builder -showbIOMode = showb -{-# INLINE showbIOMode #-} - --- | Convert a 'BufferMode' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbBufferModePrec :: Int -> BufferMode -> Builder -showbBufferModePrec = showbPrec -{-# INLINE showbBufferModePrec #-} - --- | Convert a 'HandlePosn' to a 'Builder'. --- --- /Since: 0.3/ -showbHandlePosn :: HandlePosn -> Builder -showbHandlePosn (HandlePosn h pos) - = showbHandle h <> " at position " <> showbIntegerPrec 0 pos -{-# INLINE showbHandlePosn #-} - --- | Convert a 'SeekMode' to a 'Builder'. --- --- /Since: 0.3/ -showbSeekMode :: SeekMode -> Builder -showbSeekMode = showb -{-# INLINE showbSeekMode #-} - -#if MIN_VERSION_base(4,3,0) --- | Convert a 'TextEncoding' to a 'Builder'. --- This function is only available with @base-4.3.0.0@ or later. --- --- /Since: 0.3/ -showbTextEncoding :: TextEncoding -> Builder -showbTextEncoding = fromString . textEncodingName -{-# INLINE showbTextEncoding #-} -#endif - -#if MIN_VERSION_base(4,4,0) --- | Convert a 'CodingProgress' to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbCodingProgress :: CodingProgress -> Builder -showbCodingProgress = showb -{-# INLINE showbCodingProgress #-} - --- | Convert a 'CodingFailureMode' value to a 'Builder'. --- This function is only available with @base-4.4.0.0@ or later. --- --- /Since: 0.3/ -showbCodingFailureMode :: CodingFailureMode -> Builder -showbCodingFailureMode = showb -{-# INLINE showbCodingFailureMode #-} -#endif - --- | Convert a 'Newline' to a 'Builder'. --- --- /Since: 0.3/ -showbNewline :: Newline -> Builder -showbNewline = showb -{-# INLINE showbNewline #-} - --- | Convert a 'NewlineMode' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbNewlineModePrec :: Int -> NewlineMode -> Builder -showbNewlineModePrec = showbPrec -{-# INLINE showbNewlineModePrec #-} - -instance Show Handle where - showb = showbHandle - INLINE_INST_FUN(showb) - -$(deriveShowPragmas defaultInlineShowb ''IOMode) -$(deriveShow ''BufferMode) - -instance Show HandlePosn where - showb = showbHandlePosn - INLINE_INST_FUN(showb) - -$(deriveShowPragmas defaultInlineShowb ''SeekMode) - -#if MIN_VERSION_base(4,3,0) -instance Show TextEncoding where - showb = showbTextEncoding - INLINE_INST_FUN(showb) -#endif - -#if MIN_VERSION_base(4,4,0) -$(deriveShowPragmas defaultInlineShowb ''CodingProgress) -$(deriveShowPragmas defaultInlineShowb ''CodingFailureMode) -#endif - -$(deriveShowPragmas defaultInlineShowb ''Newline) -$(deriveShowPragmas defaultInlineShowbPrec ''NewlineMode) +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.System.IO+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'IO'-related data types.++/Since: 0.3/+-}+module Text.Show.Text.System.IO (+ showbHandle+ , showbIOMode+ , showbBufferModePrec+ , showbHandlePosn+ , showbSeekMode+ , showbTextEncoding+#if MIN_VERSION_base(4,4,0)+ , showbCodingProgress+ , showbCodingFailureMode+#endif+ , showbNewline+ , showbNewlineModePrec+ ) where++import Data.Monoid.Compat ((<>))+import Data.Text.Lazy.Builder (Builder, fromString)++import GHC.IO.Encoding.Types (TextEncoding(textEncodingName))+#if MIN_VERSION_base(4,4,0)+import GHC.IO.Encoding.Failure (CodingFailureMode)+import GHC.IO.Encoding.Types (CodingProgress)+#endif+import GHC.IO.Handle (HandlePosn(..))+import GHC.IO.Handle.Types (Handle(..))++import Prelude hiding (Show)++import System.IO (BufferMode, IOMode, Newline, NewlineMode, SeekMode)++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Data.Integral (showbIntegerPrec)+import Text.Show.Text.Data.Maybe ()+import Text.Show.Text.TH.Internal (deriveShow, deriveShowPragmas,+ defaultInlineShowb, defaultInlineShowbPrec)+import Text.Show.Text.Utils (s)++#include "inline.h"++-- | Convert a 'Handle' to a 'Builder'.+-- +-- /Since: 0.3/+showbHandle :: Handle -> Builder+showbHandle (FileHandle file _) = showbHandleFilePath file+showbHandle (DuplexHandle file _ _) = showbHandleFilePath file+{-# INLINE showbHandle #-}++-- | Convert a 'Handle`'s 'FilePath' to a 'Builder'.+showbHandleFilePath :: FilePath -> Builder+showbHandleFilePath file = "{handle: " <> fromString file <> s '}'+{-# INLINE showbHandleFilePath #-}++-- | Convert an 'IOMode' to a 'Builder'.+-- +-- /Since: 0.3/+showbIOMode :: IOMode -> Builder+showbIOMode = showb+{-# INLINE showbIOMode #-}++-- | Convert a 'BufferMode' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbBufferModePrec :: Int -> BufferMode -> Builder+showbBufferModePrec = showbPrec+{-# INLINE showbBufferModePrec #-}++-- | Convert a 'HandlePosn' to a 'Builder'.+-- +-- /Since: 0.3/+showbHandlePosn :: HandlePosn -> Builder+showbHandlePosn (HandlePosn h pos)+ = showbHandle h <> " at position " <> showbIntegerPrec 0 pos+{-# INLINE showbHandlePosn #-}++-- | Convert a 'SeekMode' to a 'Builder'.+-- +-- /Since: 0.3/+showbSeekMode :: SeekMode -> Builder+showbSeekMode = showb+{-# INLINE showbSeekMode #-}++-- | Convert a 'TextEncoding' to a 'Builder'.+-- +-- /Since: 0.3/+showbTextEncoding :: TextEncoding -> Builder+showbTextEncoding = fromString . textEncodingName+{-# INLINE showbTextEncoding #-}++#if MIN_VERSION_base(4,4,0)+-- | Convert a 'CodingProgress' to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbCodingProgress :: CodingProgress -> Builder+showbCodingProgress = showb+{-# INLINE showbCodingProgress #-}++-- | Convert a 'CodingFailureMode' value to a 'Builder'.+-- This function is only available with @base-4.4.0.0@ or later.+-- +-- /Since: 0.3/+showbCodingFailureMode :: CodingFailureMode -> Builder+showbCodingFailureMode = showb+{-# INLINE showbCodingFailureMode #-}+#endif++-- | Convert a 'Newline' to a 'Builder'.+-- +-- /Since: 0.3/+showbNewline :: Newline -> Builder+showbNewline = showb+{-# INLINE showbNewline #-}++-- | Convert a 'NewlineMode' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbNewlineModePrec :: Int -> NewlineMode -> Builder+showbNewlineModePrec = showbPrec+{-# INLINE showbNewlineModePrec #-}++instance Show Handle where+ showb = showbHandle+ INLINE_INST_FUN(showb)++$(deriveShowPragmas defaultInlineShowb ''IOMode)+$(deriveShow ''BufferMode)++instance Show HandlePosn where+ showb = showbHandlePosn+ INLINE_INST_FUN(showb)++$(deriveShowPragmas defaultInlineShowb ''SeekMode)++instance Show TextEncoding where+ showb = showbTextEncoding+ INLINE_INST_FUN(showb)++#if MIN_VERSION_base(4,4,0)+$(deriveShowPragmas defaultInlineShowb ''CodingProgress)+$(deriveShowPragmas defaultInlineShowb ''CodingFailureMode)+#endif++$(deriveShowPragmas defaultInlineShowb ''Newline)+$(deriveShowPragmas defaultInlineShowbPrec ''NewlineMode)
src/Text/Show/Text/System/Posix/Types.hs view
@@ -1,399 +1,394 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE StandaloneDeriving #-} -#if !(MIN_VERSION_base(4,5,0)) -{-# LANGUAGE MagicHash #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.System.Posix.Types -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' functions for Haskell equivalents of POSIX data types. -Note that these functions are only available if the operating system supports them, -so some OSes (e.g., Windows) will not be able to use all of the functions in this -module. - -/Since: 0.3/ --} -#include "HsBaseConfig.h" - -module Text.Show.Text.System.Posix.Types ( - showbFdPrec -#if defined(HTYPE_DEV_T) - , showbCDev -#endif -#if defined(HTYPE_INO_T) - , showbCIno -#endif -#if defined(HTYPE_MODE_T) - , showbCMode -#endif -#if defined(HTYPE_OFF_T) - , showbCOffPrec -#endif -#if defined(HTYPE_PID_T) - , showbCPidPrec -#endif -#if defined(HTYPE_SSIZE_T) - , showbCSsizePrec -#endif -#if defined(HTYPE_GID_T) - , showbCGid -#endif -#if defined(HTYPE_NLINK_T) - , showbCNlink -#endif -#if defined(HTYPE_UID_T) - , showbCUid -#endif -#if defined(HTYPE_CC_T) - , showbCCc -#endif -#if defined(HTYPE_SPEED_T) - , showbCSpeed -#endif -#if defined(HTYPE_TCFLAG_T) - , showbCTcflag -#endif -#if defined(HTYPE_RLIM_T) - , showbCRLim -#endif - ) where - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import System.Posix.Types - -import Text.Show.Text.Classes (Show(showb, showbPrec)) -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Foreign.C.Types () - -#if !(MIN_VERSION_base(4,5,0)) -import GHC.Prim (unsafeCoerce#) - -import Text.Show.Text.Data.Integral ( showbInt32Prec - , showbInt64Prec - , showbWord8 - , showbWord32 - , showbWord64 - ) - -# include "inline.h" -#endif - -#if defined(HTYPE_DEV_T) --- | Convert a 'CDev' to a 'Builder'. --- --- /Since: 0.3/ -showbCDev :: CDev -> Builder -# if MIN_VERSION_base(4,5,0) -showbCDev = showb -{-# INLINE showbCDev #-} -# else -showbCDev c = showbWord64 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_INO_T) --- | Convert a 'CIno' to a 'Builder'. --- --- /Since: 0.3/ -showbCIno :: CIno -> Builder -# if MIN_VERSION_base(4,5,0) -showbCIno = showb -{-# INLINE showbCIno #-} -# else -showbCIno c = showbWord64 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_MODE_T) --- | Convert a 'CMode' to a 'Builder'. --- --- /Since: 0.3/ -showbCMode :: CMode -> Builder -# if MIN_VERSION_base(4,5,0) -showbCMode = showb -{-# INLINE showbCMode #-} -# else -showbCMode c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_OFF_T) --- | Convert a 'COff' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCOffPrec :: Int -> COff -> Builder -# if MIN_VERSION_base(4,5,0) -showbCOffPrec = showbPrec -{-# INLINE showbCOffPrec #-} -# else -showbCOffPrec p c = showbInt64Prec p $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_PID_T) --- | Convert a 'CPid' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCPidPrec :: Int -> CPid -> Builder -# if MIN_VERSION_base(4,5,0) -showbCPidPrec = showbPrec -{-# INLINE showbCPidPrec #-} -# else -showbCPidPrec p c = showbInt32Prec p $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_SSIZE_T) --- | Convert a 'CSsize' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbCSsizePrec :: Int -> CSsize -> Builder -# if MIN_VERSION_base(4,5,0) -showbCSsizePrec = showbPrec -{-# INLINE showbCSsizePrec #-} -# else -showbCSsizePrec p c = showbInt32Prec p $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_GID_T) --- | Convert a 'CGid' to a 'Builder'. --- --- /Since: 0.3/ -showbCGid :: CGid -> Builder -# if MIN_VERSION_base(4,5,0) -showbCGid = showb -{-# INLINE showbCGid #-} -# else -showbCGid c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_NLINK_T) --- | Convert a 'CNlink' to a 'Builder'. --- --- /Since: 0.3/ -showbCNlink :: CNlink -> Builder -# if MIN_VERSION_base(4,5,0) -showbCNlink = showb -{-# INLINE showbCNlink #-} -# else -showbCNlink c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_UID_T) --- | Convert a 'CUid' to a 'Builder'. --- --- /Since: 0.3/ -showbCUid :: CUid -> Builder -# if MIN_VERSION_base(4,5,0) -showbCUid = showb -{-# INLINE showbCUid #-} -# else -showbCUid c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_CC_T) --- | Convert a 'CCc' to a 'Builder'. --- --- /Since: 0.3/ -showbCCc :: CCc -> Builder -# if MIN_VERSION_base(4,5,0) -showbCCc = showb -{-# INLINE showbCCc #-} -# else -showbCCc c = showbWord8 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_SPEED_T) --- | Convert a 'CSpeed' to a 'Builder'. --- --- /Since: 0.3/ -showbCSpeed :: CSpeed -> Builder -# if MIN_VERSION_base(4,5,0) -showbCSpeed = showb -{-# INLINE showbCSpeed #-} -# else -showbCSpeed c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_TCFLAG_T) --- | Convert a 'CTcflag' to a 'Builder'. --- --- /Since: 0.3/ -showbCTcflag :: CTcflag -> Builder -# if MIN_VERSION_base(4,5,0) -showbCTcflag = showb -{-# INLINE showbCTcflag #-} -# else -showbCTcflag c = showbWord32 $ unsafeCoerce# c -# endif -#endif - -#if defined(HTYPE_RLIM_T) --- | Convert a 'CRLim' to a 'Builder'. --- --- /Since: 0.3/ -showbCRLim :: CRLim -> Builder -# if MIN_VERSION_base(4,5,0) -showbCRLim = showb -{-# INLINE showbCRLim #-} -# else -showbCRLim c = showbWord64 $ unsafeCoerce# c -# endif -#endif - --- | Convert an 'Fd' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbFdPrec :: Int -> Fd -> Builder -showbFdPrec = showbPrec -{-# INLINE showbFdPrec #-} - -#if MIN_VERSION_base(4,5,0) -# if defined(HTYPE_DEV_T) -deriving instance Show CDev -# endif - -# if defined(HTYPE_INO_T) -deriving instance Show CIno -# endif - -# if defined(HTYPE_MODE_T) -deriving instance Show CMode -# endif - -# if defined(HTYPE_OFF_T) -deriving instance Show COff -# endif - -# if defined(HTYPE_PID_T) -deriving instance Show CPid -# endif - -# if defined(HTYPE_SSIZE_T) -deriving instance Show CSsize -# endif - -# if defined(HTYPE_GID_T) -deriving instance Show CGid -# endif - -# if defined(HTYPE_NLINK_T) -deriving instance Show CNlink -# endif - -# if defined(HTYPE_UID_T) -deriving instance Show CUid -# endif - -# if defined(HTYPE_CC_T) -deriving instance Show CCc -# endif - -# if defined(HTYPE_SPEED_T) -deriving instance Show CSpeed -# endif - -# if defined(HTYPE_TCFLAG_T) -deriving instance Show CTcflag -# endif - -# if defined(HTYPE_RLIM_T) -deriving instance Show CRLim -# endif -#else -# if defined(HTYPE_DEV_T) -instance Show CDev where - showb = showbCDev - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_INO_T) -instance Show CIno where - showb = showbCIno - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_MODE_T) -instance Show CMode where - showb = showbCMode - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_OFF_T) -instance Show COff where - showbPrec = showbCOffPrec - INLINE_INST_FUN(showbPrec) -# endif - -# if defined(HTYPE_PID_T) -instance Show CPid where - showbPrec = showbCPidPrec - INLINE_INST_FUN(showbPrec) -# endif - -# if defined(HTYPE_SSIZE_T) -instance Show CSsize where - showbPrec = showbCSsizePrec - INLINE_INST_FUN(showbPrec) -# endif - -# if defined(HTYPE_GID_T) -instance Show CGid where - showb = showbCGid - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_NLINK_T) -instance Show CNlink where - showb = showbCNlink - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_UID_T) -instance Show CUid where - showb = showbCUid - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_CC_T) -instance Show CCc where - showb = showbCCc - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_SPEED_T) -instance Show CSpeed where - showb = showbCSpeed - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_TCFLAG_T) -instance Show CTcflag where - showb = showbCTcflag - INLINE_INST_FUN(showb) -# endif - -# if defined(HTYPE_RLIM_T) -instance Show CRLim where - showb = showbCRLim - INLINE_INST_FUN(showb) -# endif -#endif - -deriving instance Show Fd +{-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Text.Show.Text.System.Posix.Types+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' functions for Haskell equivalents of POSIX data types.+Note that these functions are only available if the operating system supports them,+so some OSes (e.g., Windows) will not be able to use all of the functions in this+module.++/Since: 0.3/+-}+#include "HsBaseConfig.h"++module Text.Show.Text.System.Posix.Types (+ showbFdPrec+#if defined(HTYPE_DEV_T)+ , showbCDev+#endif+#if defined(HTYPE_INO_T)+ , showbCIno+#endif+#if defined(HTYPE_MODE_T)+ , showbCMode+#endif+#if defined(HTYPE_OFF_T)+ , showbCOffPrec+#endif+#if defined(HTYPE_PID_T)+ , showbCPidPrec+#endif+#if defined(HTYPE_SSIZE_T)+ , showbCSsizePrec+#endif+#if defined(HTYPE_GID_T)+ , showbCGid+#endif+#if defined(HTYPE_NLINK_T)+ , showbCNlink+#endif+#if defined(HTYPE_UID_T)+ , showbCUid+#endif+#if defined(HTYPE_CC_T)+ , showbCCc+#endif+#if defined(HTYPE_SPEED_T)+ , showbCSpeed+#endif+#if defined(HTYPE_TCFLAG_T)+ , showbCTcflag+#endif+#if defined(HTYPE_RLIM_T)+ , showbCRLim+#endif+ ) where++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import System.Posix.Types++import Text.Show.Text.Classes (Show(showb, showbPrec))+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Foreign.C.Types ()++#if !(MIN_VERSION_base(4,5,0))+import Data.Int+import Data.Word++import Unsafe.Coerce (unsafeCoerce)++# include "HsBaseConfig.h"+# include "inline.h"+#endif++#if defined(HTYPE_DEV_T)+-- | Convert a 'CDev' to a 'Builder'.+-- +-- /Since: 0.3/+showbCDev :: CDev -> Builder+# if MIN_VERSION_base(4,5,0)+showbCDev = showb+{-# INLINE showbCDev #-}+# else+showbCDev = unsafeCoerce (showb :: HTYPE_DEV_T -> Builder)+# endif+#endif++#if defined(HTYPE_INO_T)+-- | Convert a 'CIno' to a 'Builder'.+-- +-- /Since: 0.3/+showbCIno :: CIno -> Builder+# if MIN_VERSION_base(4,5,0)+showbCIno = showb+{-# INLINE showbCIno #-}+# else+showbCIno = unsafeCoerce (showb :: HTYPE_INO_T -> Builder)+# endif+#endif++#if defined(HTYPE_MODE_T)+-- | Convert a 'CMode' to a 'Builder'.+-- +-- /Since: 0.3/+showbCMode :: CMode -> Builder+# if MIN_VERSION_base(4,5,0)+showbCMode = showb+{-# INLINE showbCMode #-}+# else+showbCMode = unsafeCoerce (showb :: HTYPE_MODE_T -> Builder)+# endif+#endif++#if defined(HTYPE_OFF_T)+-- | Convert a 'COff' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCOffPrec :: Int -> COff -> Builder+# if MIN_VERSION_base(4,5,0)+showbCOffPrec = showbPrec+{-# INLINE showbCOffPrec #-}+# else+showbCOffPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_OFF_T -> Builder)+# endif+#endif++#if defined(HTYPE_PID_T)+-- | Convert a 'CPid' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCPidPrec :: Int -> CPid -> Builder+# if MIN_VERSION_base(4,5,0)+showbCPidPrec = showbPrec+{-# INLINE showbCPidPrec #-}+# else+showbCPidPrec = unsafeCoerce (showbPrec :: Int -> HTYPE_PID_T -> Builder)+# endif+#endif++#if defined(HTYPE_SSIZE_T)+-- | Convert a 'CSsize' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbCSsizePrec :: Int -> CSsize -> Builder+# if MIN_VERSION_base(4,5,0)+showbCSsizePrec = showbPrec+{-# INLINE showbCSsizePrec #-}+# else+showbCSsizePrec = unsafeCoerce (showbPrec :: Int -> HTYPE_SSIZE_T -> Builder)+# endif+#endif++#if defined(HTYPE_GID_T)+-- | Convert a 'CGid' to a 'Builder'.+-- +-- /Since: 0.3/+showbCGid :: CGid -> Builder+# if MIN_VERSION_base(4,5,0)+showbCGid = showb+{-# INLINE showbCGid #-}+# else+showbCGid = unsafeCoerce (showb :: HTYPE_GID_T -> Builder)+# endif+#endif++#if defined(HTYPE_NLINK_T)+-- | Convert a 'CNlink' to a 'Builder'.+-- +-- /Since: 0.3/+showbCNlink :: CNlink -> Builder+# if MIN_VERSION_base(4,5,0)+showbCNlink = showb+{-# INLINE showbCNlink #-}+# else+showbCNlink = unsafeCoerce (showb :: HTYPE_NLINK_T -> Builder)+# endif+#endif++#if defined(HTYPE_UID_T)+-- | Convert a 'CUid' to a 'Builder'.+-- +-- /Since: 0.3/+showbCUid :: CUid -> Builder+# if MIN_VERSION_base(4,5,0)+showbCUid = showb+{-# INLINE showbCUid #-}+# else+showbCUid = unsafeCoerce (showb :: HTYPE_UID_T -> Builder)+# endif+#endif++#if defined(HTYPE_CC_T)+-- | Convert a 'CCc' to a 'Builder'.+-- +-- /Since: 0.3/+showbCCc :: CCc -> Builder+# if MIN_VERSION_base(4,5,0)+showbCCc = showb+{-# INLINE showbCCc #-}+# else+showbCCc = unsafeCoerce (showb :: HTYPE_CC_T -> Builder)+# endif+#endif++#if defined(HTYPE_SPEED_T)+-- | Convert a 'CSpeed' to a 'Builder'.+-- +-- /Since: 0.3/+showbCSpeed :: CSpeed -> Builder+# if MIN_VERSION_base(4,5,0)+showbCSpeed = showb+{-# INLINE showbCSpeed #-}+# else+showbCSpeed = unsafeCoerce (showb :: HTYPE_SPEED_T -> Builder)+# endif+#endif++#if defined(HTYPE_TCFLAG_T)+-- | Convert a 'CTcflag' to a 'Builder'.+-- +-- /Since: 0.3/+showbCTcflag :: CTcflag -> Builder+# if MIN_VERSION_base(4,5,0)+showbCTcflag = showb+{-# INLINE showbCTcflag #-}+# else+showbCTcflag = unsafeCoerce (showb :: HTYPE_TCFLAG_T -> Builder)+# endif+#endif++#if defined(HTYPE_RLIM_T)+-- | Convert a 'CRLim' to a 'Builder'.+-- +-- /Since: 0.3/+showbCRLim :: CRLim -> Builder+# if MIN_VERSION_base(4,5,0)+showbCRLim = showb+{-# INLINE showbCRLim #-}+# else+showbCRLim = unsafeCoerce (showb :: HTYPE_RLIM_T -> Builder)+# endif+#endif++-- | Convert an 'Fd' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbFdPrec :: Int -> Fd -> Builder+showbFdPrec = showbPrec+{-# INLINE showbFdPrec #-}++#if MIN_VERSION_base(4,5,0)+# if defined(HTYPE_DEV_T)+deriving instance Show CDev+# endif++# if defined(HTYPE_INO_T)+deriving instance Show CIno+# endif++# if defined(HTYPE_MODE_T)+deriving instance Show CMode+# endif++# if defined(HTYPE_OFF_T)+deriving instance Show COff+# endif++# if defined(HTYPE_PID_T)+deriving instance Show CPid+# endif++# if defined(HTYPE_SSIZE_T)+deriving instance Show CSsize+# endif++# if defined(HTYPE_GID_T)+deriving instance Show CGid+# endif++# if defined(HTYPE_NLINK_T)+deriving instance Show CNlink+# endif++# if defined(HTYPE_UID_T)+deriving instance Show CUid+# endif++# if defined(HTYPE_CC_T)+deriving instance Show CCc+# endif++# if defined(HTYPE_SPEED_T)+deriving instance Show CSpeed+# endif++# if defined(HTYPE_TCFLAG_T)+deriving instance Show CTcflag+# endif++# if defined(HTYPE_RLIM_T)+deriving instance Show CRLim+# endif+#else+# if defined(HTYPE_DEV_T)+instance Show CDev where+ showb = showbCDev+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_INO_T)+instance Show CIno where+ showb = showbCIno+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_MODE_T)+instance Show CMode where+ showb = showbCMode+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_OFF_T)+instance Show COff where+ showbPrec = showbCOffPrec+ INLINE_INST_FUN(showbPrec)+# endif++# if defined(HTYPE_PID_T)+instance Show CPid where+ showbPrec = showbCPidPrec+ INLINE_INST_FUN(showbPrec)+# endif++# if defined(HTYPE_SSIZE_T)+instance Show CSsize where+ showbPrec = showbCSsizePrec+ INLINE_INST_FUN(showbPrec)+# endif++# if defined(HTYPE_GID_T)+instance Show CGid where+ showb = showbCGid+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_NLINK_T)+instance Show CNlink where+ showb = showbCNlink+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_UID_T)+instance Show CUid where+ showb = showbCUid+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_CC_T)+instance Show CCc where+ showb = showbCCc+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_SPEED_T)+instance Show CSpeed where+ showb = showbCSpeed+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_TCFLAG_T)+instance Show CTcflag where+ showb = showbCTcflag+ INLINE_INST_FUN(showb)+# endif++# if defined(HTYPE_RLIM_T)+instance Show CRLim where+ showb = showbCRLim+ INLINE_INST_FUN(showb)+# endif+#endif++deriving instance Show Fd
src/Text/Show/Text/TH.hs view
@@ -1,18 +1,18 @@-{-| -Module: Text.Show.Text.TH -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Functions to mechanically derive @Show@ instances or splice -@show@-related expressions into Haskell source code. You need to enable -the @TemplateHaskell@ language extension in order to use this module. - -/Since: 0.3/ --} -module Text.Show.Text.TH (module Text.Show.Text.TH.Internal) where - -import Text.Show.Text.Instances () +{-|+Module: Text.Show.Text.TH+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Functions to mechanically derive @Show@ instances or splice+@show@-related expressions into Haskell source code. You need to enable+the @TemplateHaskell@ language extension in order to use this module.++/Since: 0.3/+-}+module Text.Show.Text.TH (module Text.Show.Text.TH.Internal) where++import Text.Show.Text.Instances () import Text.Show.Text.TH.Internal
src/Text/Show/Text/TH/Internal.hs view
@@ -1,784 +1,798 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE TemplateHaskell #-} -{-| -Module: Text.Show.Text.TH.Internal -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Functions to mechanically derive 'T.Show' instances or splice -@show@-related expressions into Haskell source code. You need to enable -the @TemplateHaskell@ language extension in order to use this module. - -This implementation is based off of the @Data.Aeson.TH@ module from the -@aeson@ library. --} -module Text.Show.Text.TH.Internal ( - -- * @deriveShow@ - -- $deriveShow - deriveShow - , deriveShowPragmas - -- * @mk@ functions - -- $mk - , mkShow - , mkShowLazy - , mkShowPrec - , mkShowPrecLazy - , mkShowList - , mkShowListLazy - , mkShowb - , mkShowbPrec - , mkShowbList - , mkPrint - , mkPrintLazy - , mkHPrint - , mkHPrintLazy - -- * Advanced pragma options - , PragmaOptions(..) - , defaultPragmaOptions - , defaultInlineShowbPrec - , defaultInlineShowb - , defaultInlineShowbList - ) where - -#if !(MIN_VERSION_base(4,8,0)) -import Data.Functor ((<$>)) -#endif -import Data.List (foldl', intersperse) -#if MIN_VERSION_template_haskell(2,7,0) -import Data.List (find) -import Data.Maybe (fromJust) -#endif -import qualified Data.Text as TS () -import qualified Data.Text.IO as TS (putStrLn, hPutStrLn) -import Data.Text.Lazy (toStrict) -import Data.Text.Lazy.Builder (fromString, toLazyText) -import qualified Data.Text.Lazy as TL () -import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn) - -import GHC.Exts (Char(..), Double(..), Float(..), Int(..), Word(..)) -import GHC.Prim (Char#, Double#, Float#, Int#, Word#) -import GHC.Show (appPrec, appPrec1) - -import Language.Haskell.TH - -import Prelude hiding (Show) - -import qualified Text.Show as S (Show(show)) -import qualified Text.Show.Text.Classes as T -import Text.Show.Text.Classes (showb, showbPrec, showbListWith, - showbParen, showbSpace) -#if __GLASGOW_HASKELL__ >= 702 -import Text.Show.Text.Classes (showbList) -#endif -import Text.Show.Text.Utils ((<>), isInfixTypeCon, isTupleString, s) - -{- $deriveShow - -'deriveShow' automatically generates a 'T.Show' instance declaration for a @data@ -type, a @newtype@, a data family instance, or a whole data family. This emulates what -would (hypothetically) happen if you could attach a @deriving 'T.Show'@ clause to the -end of a data declaration. - -Here are some examples of how to derive simple data types: - -@ -{-# LANGUAGE TemplateHaskell #-} -import Text.Show.Text.TH (deriveShow) - -data Letter = A | B | C -$('deriveShow' ''Letter) -- instance Show Letter where ... - -newtype Box a = Box a -$('deriveShow' ''Box) -- instance Show a => Show (Box a) where ... -@ - -If you are using @template-haskell-2.7.0.0@ or later, 'deriveShow' can also be used -to derive 'T.Show' instances for data families. Some examples: - -@ -{-# LANGUAGE FlexibleInstances, TemplateHaskell, TypeFamilies #-} -import Text.Show.Text.TH (deriveShow) - -class AssocClass a where - data AssocData a -instance AssocClass Int where - data AssocData Int = AssocDataInt Int Int -instance AssocClass Char where - newtype AssocData Char = AssocDataChar Char -$('deriveShow' 'AssocDataChar) -- Only one single quote! --- Generates a Show instance for AssocDataChar, but not AssocDataInt - -data family DataFam a -data instance DataFam Int = DataFamInt Int Int -newtype instance DataFam Char = DataFamChar Char -$('deriveShow' ''DataFam) -- Two single quotes! --- Generates Show instances for all data instances of DataFam --- (DataFamInt and DataFamChar) -@ - -Note that at the moment, there are some limitations to this approach: - -* The 'Name' argument to 'deriveShow' must not be a type synonym. - -* 'deriveShow' makes the assumption that all type variables in a data type require a - 'T.Show' constraint when creating the type context. For example, if you have @data - Phantom a = Phantom@, then @('deriveShow' ''Phantom)@ will generate @instance - 'T.Show' a => 'T.Show' (Phantom a) where@, even though @'T.Show' a@ is not required. - If you want a proper 'T.Show' instance for @Phantom@, you will need to use - 'mkShowbPrec' (see the documentation of the 'mk' functions for more information). - -* 'deriveShow' lacks the ability to properly detect data types with higher-kinded - type parameters (e.g., @data HK f a = HK (f a)@) or with kinds other than @*@ - (e.g., @data List a (empty :: Bool)@). If you wish to derive 'T.Show' - instances for these data types, you will need to use 'mkShowbPrec' (see the - documentation of the 'mk' functions for more information). - -* Some data constructors have arguments whose 'T.Show' instance depends on a - typeclass besides 'T.Show'. For example, consider @newtype MyFixed a = MyFixed - (Fixed a)@. @'Fixed' a@ is a 'T.Show' instance only if @a@ is an instance of both - @HasResolution@ and 'T.Show'. Unfortunately, 'deriveShow' cannot infer that 'a' must - be an instance of 'HasResolution', so it cannot create a 'T.Show' instance for - @MyFixed@. However, you can use 'mkShowbPrec' to get around this (see the - documentation of the 'mk' functions for more information). - --} - --- | Generates a 'T.Show' instance declaration for the given data type or family. --- --- /Since: 0.3/ -deriveShow :: Name -- ^ Name of the data type to make an instance of 'T.Show' - -> Q [Dec] -deriveShow = deriveShowPragmas defaultPragmaOptions - --- | Generates a 'T.Show' instance declaration for the given data type or family. --- You shouldn't need to use this function unless you know what you are doing. --- --- Unlike 'deriveShow', this function allows configuration of whether to inline --- 'showbPrec', 'showb', or 'showbList'. It also allows for specializing instances --- certain types. For example: --- --- @ --- {-# LANGUAGE TemplateHaskell #-} --- import Text.Show.Text.TH --- --- data ADT a = ADT a --- $(deriveShowPragmas 'defaultInlineShowbPrec' { --- specializeTypes = [ [t| ADT Int |] ] --- } --- ''ADT) --- @ --- --- This declararation would produce code like this: --- --- @ --- instance Show a => Show (ADT a) where --- {-# INLINE showbPrec #-} --- {-# SPECIALIZE instance Show (ADT Int) #-} --- showbPrec = ... --- @ --- --- Beware: 'deriveShow' can generate extremely long code splices, so it may be unwise --- to inline in some cases. Use with caution. --- --- /Since: 0.5/ -deriveShowPragmas :: PragmaOptions -- ^ Specifies what pragmas to generate with this instance - -> Name -- ^ Name of the data type to make an instance of 'T.Show' - -> Q [Dec] -deriveShowPragmas opts name = do - info <- reify name - case info of - TyConI{} -> deriveShowTyCon opts name -#if MIN_VERSION_template_haskell(2,7,0) - DataConI{} -> deriveShowDataFamInst opts name - FamilyI (FamilyD DataFam _ _ _) _ -> deriveShowDataFam opts name - FamilyI (FamilyD TypeFam _ _ _) _ -> error $ ns ++ "Cannot use a type family name." - -- TODO: Figure out how this whole multiline string business works - _ -> error $ ns ++ "The name must be of a plain type constructor, data family, or data family instance constructor." -#else - _ -> error $ ns ++ "The name must be of a plain type constructor." -#endif - where - ns :: String - ns = "Text.Show.Text.TH.deriveShow: " - --- | Generates a 'T.Show' instance declaration for a plain type constructor. -deriveShowTyCon :: PragmaOptions - -> Name - -> Q [Dec] -deriveShowTyCon opts tyConName = withTyCon tyConName fromCons - where - fromCons :: [TyVarBndr] -> [Con] -> Q [Dec] - fromCons tvbs cons = (:[]) <$> - instanceD (applyCon ''T.Show typeNames) - (appT (conT ''T.Show) instanceType) - (showbPrecDecs opts cons) - where - typeNames :: [Name] - typeNames = map tvbName tvbs - - instanceType :: Q Type - instanceType = foldl' appT (conT tyConName) $ map varT typeNames - -#if MIN_VERSION_template_haskell(2,7,0) --- | Generates a 'T.Show' instance declaration for a data family name. -deriveShowDataFam :: PragmaOptions - -> Name - -> Q [Dec] -deriveShowDataFam opts dataFamName = withDataFam dataFamName $ \tvbs decs -> - flip mapM decs $ deriveShowDataFamFromDec opts dataFamName tvbs - --- | Generates a 'T.Show' instance declaration for a data family instance constructor. -deriveShowDataFamInst :: PragmaOptions - -> Name - -> Q [Dec] -deriveShowDataFamInst opts dataFamInstName = (:[]) <$> - withDataFamInstCon dataFamInstName (deriveShowDataFamFromDec opts) - --- | Generates a single 'T.Show' instance declaration for a data family instance. This --- code is used by 'deriveShowDataFam' and 'deriveShowDataFamInst' alike. -deriveShowDataFamFromDec :: PragmaOptions - -> Name - -> [TyVarBndr] - -> Dec - -> Q Dec -deriveShowDataFamFromDec opts parentName tvbs dec = - instanceD (applyCon ''T.Show lhsTypeNames) - (appT (conT ''T.Show) instanceType) - (showbPrecDecs opts $ decCons [dec]) - where - typeNames :: [Name] - typeNames = map tvbName tvbs - - -- It seems that Template Haskell's representation of the type variable binders - -- in a data family instance declaration has changed considerably with each new - -- version. Yikes. - -- - -- In @template-haskell-2.8.0.0@, only the TyVarBndrs up to the rightmost non-type - -- variable are provided, so we have to do some careful Name manipulation to get - -- the LHS of the instance context just right. - -- - -- Other versions of @template-haskell@ seem a bit more sensible. - lhsTypeNames :: [Name] -# if !(MIN_VERSION_template_haskell(2,9,0)) || MIN_VERSION_template_haskell(2,10,0) - lhsTypeNames = filterTyVars typeNames instTypes -# else - lhsTypeNames = filterTyVars (take (length instTypes) typeNames) instTypes - ++ drop (length instTypes) typeNames -# endif - - filterTyVars :: [Name] -> [Type] -> [Name] - filterTyVars ns (SigT t _:ts) = filterTyVars ns (t:ts) - filterTyVars (_:ns) (VarT n :ts) = n : filterTyVars ns ts - filterTyVars (_:ns) (_ :ts) = filterTyVars ns ts - filterTyVars [] _ = [] - filterTyVars _ [] = [] - - rhsTypes :: [Type] - rhsTypes = instTypes ++ drop (length instTypes) (map VarT typeNames) - - instTypes :: [Type] - instTypes = let tys = case dec of - DataInstD _ _ tys' _ _ -> tys' - NewtypeInstD _ _ tys' _ _ -> tys' - _ -> error "Text.Show.Text.TH.deriveShow: The impossible happened." -# if MIN_VERSION_template_haskell(2,10,0) - in tys -# else - -- If PolyKinds is enabled, the first entries in this list will be - -- kind signatures on early versions of GHC, so drop them - in if length tys > length tvbs - then drop (length tvbs) tys - else tys -# endif - - instanceType :: Q Type - instanceType = foldl' appT (conT parentName) $ map return rhsTypes -#endif - -{- $mk - -There may be scenarios in which you want to show an arbitrary data type or family -without having to make the type an instance of 'T.Show'. For these cases, -"Text.Show.Text.TH" provide several functions (all prefixed with @mk@) that splice -the appropriate lambda expression into your source code. - -As an example, suppose you have @data ADT = ADT@, which is not an instance of 'T.Show'. -With @mkShow@, you can still convert it to 'Text': - -@ -{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} -import Text.Show.Text.TH (mkShow) - -whichADT :: Bool -whichADT = $(mkShow ''ADT) ADT == \"ADT\" -@ - -'mk' functions are also useful for creating 'T.Show' instances for data types with -sophisticated type parameters. For example, 'deriveShow' cannot infer the correct type -context for @newtype HigherKinded f a = HigherKinded (f a)@, since @f@ is a -higher-kinded type parameter. However, it is still possible to derive a 'T.Show' -instance for @HigherKinded@ without too much trouble using 'mkShowbPrec': - -@ -{-# LANGUAGE FlexibleContexts, TemplateHaskell #-} -import Prelude hiding (Show) -import Text.Show.Text (Show(showbPrec)) -import Text.Show.Text.TH (mkShowbPrec) - -instance Show (f a) => Show (HigherKinded f a) where - showbPrec = $(mkShowbPrec ''HigherKinded) -@ - --} - --- | Generates a lambda expression which behaves like 'T.show' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShow :: Name -> Q Exp -mkShow name = [| toStrict . $(mkShowLazy name) |] - --- | Generates a lambda expression which behaves like 'T.showLazy' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShowLazy :: Name -> Q Exp -mkShowLazy name = [| toLazyText . $(mkShowb name) |] - --- | Generates a lambda expression which behaves like 'T.showPrec' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShowPrec :: Name -> Q Exp -mkShowPrec name = [| \p -> toStrict . $(mkShowPrecLazy name) p |] - --- | Generates a lambda expression which behaves like 'T.showPrecLazy' (without --- requiring a 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShowPrecLazy :: Name -> Q Exp -mkShowPrecLazy name = [| \p -> toLazyText . $(mkShowbPrec name) p |] - --- | Generates a lambda expression which behaves like 'T.showList' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.5/ -mkShowList :: Name -> Q Exp -mkShowList name = [| toStrict . $(mkShowListLazy name) |] - --- | Generates a lambda expression which behaves like 'T.showListLazy' (without --- requiring a 'T.Show' instance). --- --- /Since: 0.5/ -mkShowListLazy :: Name -> Q Exp -mkShowListLazy name = [| toLazyText . $(mkShowbList name) |] - --- | Generates a lambda expression which behaves like 'T.showb' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShowb :: Name -> Q Exp -mkShowb name = mkShowbPrec name `appE` [| 0 :: Int |] - --- | Generates a lambda expression which behaves like 'T.showPrec' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkShowbPrec :: Name -> Q Exp -mkShowbPrec name = do - info <- reify name - case info of - TyConI{} -> withTyCon name $ \_ decs -> consToShow decs -#if MIN_VERSION_template_haskell(2,7,0) - DataConI{} -> withDataFamInstCon name $ \_ _ dec -> - consToShow $ decCons [dec] - FamilyI (FamilyD DataFam _ _ _) _ -> withDataFam name $ \_ decs -> - consToShow $ decCons decs - FamilyI (FamilyD TypeFam _ _ _) _ -> error $ ns ++ "Cannot use a type family name." - -- TODO: Figure out how this whole multiline string business works - _ -> error $ ns ++ "The name must be of a plain type constructor, data family, or data family instance constructor." -#else - _ -> error $ ns ++ "The name must be of a plain type constructor." -#endif - where - ns :: String - ns = "Text.Show.Text.TH.mk: " - --- | Generates a lambda expression which behaves like 'T.showbList' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.5/ -mkShowbList :: Name -> Q Exp -mkShowbList name = [| showbListWith $(mkShowb name) |] - --- | Generates a lambda expression which behaves like 'T.print' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkPrint :: Name -> Q Exp -mkPrint name = [| TS.putStrLn . $(mkShow name) |] - --- | Generates a lambda expression which behaves like 'T.printLazy' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkPrintLazy :: Name -> Q Exp -mkPrintLazy name = [| TL.putStrLn . $(mkShowLazy name) |] - --- | Generates a lambda expression which behaves like 'T.hPrint' (without requiring a --- 'T.Show' instance). --- --- /Since: 0.3.1/ -mkHPrint :: Name -> Q Exp -mkHPrint name = [| \h -> TS.hPutStrLn h . $(mkShow name) |] - --- | Generates a lambda expression which behaves like 'T.hPrintLazy' (without --- requiring a 'T.Show' instance). --- --- /Since: 0.3.1/ -mkHPrintLazy :: Name -> Q Exp -mkHPrintLazy name = [| \h -> TL.hPutStrLn h . $(mkShowLazy name) |] - --- | Options that specify what @INLINE@ or @SPECIALIZE@ pragmas to generate with --- a 'T.Show' instance. --- --- /Since: 0.5/ -data PragmaOptions = PragmaOptions { - inlineShowbPrec :: Bool -- ^ Whether to inline 'showbPrec' - , inlineShowb :: Bool -- ^ Whether to inline 'showb' - , inlineShowbList :: Bool -- ^ Whether to inline 'showbList' - , specializeTypes :: [Q Type] -- ^ Types for which to create specialized instance declarations -} - --- | Do not generate any pragmas with a 'T.Show' instance. --- --- /Since: 0.5/ -defaultPragmaOptions :: PragmaOptions -defaultPragmaOptions = PragmaOptions False False False [] - --- | Inline the 'showbPrec' function in a 'T.Show' instance. --- --- /Since: 0.5/ -defaultInlineShowbPrec :: PragmaOptions -defaultInlineShowbPrec = defaultPragmaOptions { inlineShowbPrec = True } - --- | Inline the 'showb' function in a 'T.Show' instance. --- --- /Since: 0.5/ -defaultInlineShowb :: PragmaOptions -defaultInlineShowb = defaultPragmaOptions { inlineShowb = True } - --- | Inline the 'showbList' function in a 'T.Show' instance. --- --- /Since: 0.5/ -defaultInlineShowbList :: PragmaOptions -defaultInlineShowbList = defaultPragmaOptions { inlineShowbList = True } - --- | Generates code to generate the 'T.Show' encoding of a number of constructors. --- All constructors must be from the same type. -consToShow :: [Con] -> Q Exp -consToShow [] = error $ "Text.Show.Text.TH.consToShow: Not a single constructor given!" -consToShow cons = do - p <- newName "p" - value <- newName "value" - lam1E (varP p) - . lam1E (varP value) - . caseE (varE value) - $ map (encodeArgs p) cons - --- | Generates code to generate the 'T.Show' encoding of a single constructor. -encodeArgs :: Name -> Con -> Q Match -encodeArgs p (NormalC conName []) - = match (conP conName []) - (normalB [| intConst (fromString $(stringE (nameBase conName))) $(varE p) |]) - [] -encodeArgs p (NormalC conName [(_, argTy)]) = do - arg <- newName "arg" - - let showArg = showbPrecPrim appPrec1 argTy arg - namedArg = [| fromString $(stringE (nameBase conName)) <> showbSpace <> $(showArg) |] - - match (conP conName [varP arg]) - (normalB [| showbParen ($(varE p) > appPrec) $(namedArg) |]) - [] -encodeArgs p (NormalC conName ts) = do - args <- mapM newName ["arg" ++ S.show n | (_, n) <- zip ts [1 :: Int ..]] - - if isNonUnitTuple conName - then do - let showArgs = map (appE [| showb |] . varE) args - parenCommaArgs = [| s '(' |] : intersperse [| s ',' |] showArgs - mappendArgs = foldr (flip infixApp [| (<>) |]) - [| s ')' |] - parenCommaArgs - - match (conP conName $ map varP args) - (normalB [| intConst $(mappendArgs) $(varE p) |]) - [] - else do - let showArgs = map (\(arg, (_, argTy)) -> showbPrecPrim appPrec1 argTy arg) - (zip args ts) - mappendArgs = foldr1 (\v q -> [| $(v) <> showbSpace <> $(q) |]) showArgs - namedArgs = [| fromString $(stringE (nameBase conName)) <> showbSpace <> $(mappendArgs) |] - - match (conP conName $ map varP args) - (normalB [| showbParen ($(varE p) > appPrec) $(namedArgs) |]) - [] -encodeArgs p (RecC conName []) = encodeArgs p $ NormalC conName [] -encodeArgs p (RecC conName ts) = do - args <- mapM newName ["arg" ++ S.show n | (_, n) <- zip ts [1 :: Int ..]] - - let showArgs = concatMap (\(arg, (argName, _, argTy)) - -> [ [| fromString $(stringE (nameBase argName)) |] - , [| fromString " = " |] - , showbPrecPrim 0 argTy arg - , [| fromString ", " |] - ] - ) - (zip args ts) - braceCommaArgs = [| s '{' |] : take (length showArgs - 1) showArgs - mappendArgs = foldr (flip infixApp [| (<>) |]) - [| s '}' |] - braceCommaArgs - namedArgs = [| fromString $(stringE (nameBase conName)) <> showbSpace <> $(mappendArgs) |] - - match (conP conName $ map varP args) - (normalB [| showbParen ($(varE p) > appPrec) $(namedArgs) |]) - [] -encodeArgs p (InfixC (_, alTy) conName (_, arTy)) = do - al <- newName "argL" - ar <- newName "argR" - info <- reify conName - - let conPrec = case info of - DataConI _ _ _ (Fixity prec _) -> prec - other -> error $ "Text.Show.Text.TH.encodeArgs: Unsupported type: " ++ S.show other - opName = nameBase conName - infixOpE = if isInfixTypeCon opName - then [| fromString opName |] - else [| s '`' <> fromString opName <> s '`' |] - - match (infixP (varP al) conName (varP ar)) - (normalB $ appE [| showbParen ($(varE p) > conPrec) |] - [| $(showbPrecPrim (conPrec + 1) alTy al) - <> showbSpace - <> $(infixOpE) - <> showbSpace - <> $(showbPrecPrim (conPrec + 1) arTy ar) - |] - ) - [] -encodeArgs p (ForallC _ _ con) = encodeArgs p con - -------------------------------------------------------------------------------- --- Utility functions -------------------------------------------------------------------------------- - --- | Checks if an type variable has an unlifted type that can be shown. If so, --- wrap it in its corresponding constructor and show it. Otherwise, only show --- the type variable. -showbPrecPrim :: Int -> Type -> Name -> Q Exp -#if __GLASGOW_HASKELL__ >= 712 --- Starting with GHC 7.10, data types containing unlifted types with derived @Show@ --- instances show hashed literals with actual hash signs, and negative hashed --- literals are not surrounded with parentheses. -showbPrecPrim p (ConT tyName) tyVarName = showE - where - tyVarE :: Q Exp - tyVarE = varE tyVarName - - showE :: Q Exp - showE | tyName == ''Char# = [| showbPrec 0 (C# $(tyVarE)) <> s '#' |] - | tyName == ''Double# = [| showbPrec 0 (D# $(tyVarE)) <> fromString "##" |] - | tyName == ''Float# = [| showbPrec 0 (F# $(tyVarE)) <> s '#' |] - | tyName == ''Int# = [| showbPrec 0 (I# $(tyVarE)) <> s '#' |] - | tyName == ''Word# = [| showbPrec 0 (W# $(tyVarE)) <> fromString "##" |] - | otherwise = [| showbPrec p $(tyVarE) |] -#else -showbPrecPrim p (ConT tyName) tyVarName = [| showbPrec p $(expr) |] - where - tyVarE :: Q Exp - tyVarE = varE tyVarName - - expr :: Q Exp - expr | tyName == ''Char# = [| C# $(tyVarE) |] - | tyName == ''Double# = [| D# $(tyVarE) |] - | tyName == ''Float# = [| F# $(tyVarE) |] - | tyName == ''Int# = [| I# $(tyVarE) |] - | tyName == ''Word# = [| W# $(tyVarE) |] - | otherwise = tyVarE -#endif -showbPrecPrim p _ tyVarName = [| showbPrec p $(varE tyVarName) |] - --- | Checks if a 'Name' represents a tuple type constructor (other than '()') -isNonUnitTuple :: Name -> Bool -isNonUnitTuple = isTupleString . nameBase - --- | A type-restricted version of 'const'. This is useful when generating the lambda --- expression in 'mkShowbPrec' for a data type with only nullary constructors (since --- the expression wouldn't depend on the precedence). For example, if you had @data --- Nullary = Nullary@ and attempted to run @$(mkShowbPrec ''Nullary) Nullary@, simply --- ignoring the precedence argument would cause the type signature of @$(mkShowbPrec --- ''Nullary)@ to be @a -> Nullary -> Builder@, not @Int -> Nullary -> Builder@. --- --- To avoid this problem, after computing the 'Builder' @b@, we call @intConst b p@, --- where @p@ is the precedence argument. This forces @p :: Int@. -intConst :: a -> Int -> a -intConst = const -{-# INLINE intConst #-} - --- | Extracts a plain type constructor's information. -withTyCon :: Name -- ^ Name of the plain type constructor - -> ([TyVarBndr] -> [Con] -> Q a) - -- ^ Function that generates the actual code. Will be applied - -- to the type variable binders and constructors extracted - -- from the given 'Name'. - -> Q a - -- ^ Resulting value in the 'Q'uasi monad. -withTyCon name f = do - info <- reify name - case info of - TyConI dec -> - case dec of - DataD _ _ tvbs cons _ -> f tvbs cons - NewtypeD _ _ tvbs con _ -> f tvbs [con] - other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data type or newtype." - _ -> error $ ns ++ "The name must be of a plain type constructor." - where - ns :: String - ns = "Text.Show.Text.TH.withTyCon: " - -#if MIN_VERSION_template_haskell(2,7,0) --- | Extracts a data family name's information. -withDataFam :: Name - -> ([TyVarBndr] -> [Dec] -> Q a) - -> Q a -withDataFam name f = do - info <- reify name - case info of - FamilyI (FamilyD DataFam _ tvbs _) decs -> f tvbs decs - FamilyI (FamilyD TypeFam _ _ _) _ -> - error $ ns ++ "Cannot use a type family name." - other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data family name." - where - ns :: String - ns = "Text.Show.Text.TH.withDataFam: " - --- | Extracts a data family instance constructor's information. -withDataFamInstCon :: Name - -> (Name -> [TyVarBndr] -> Dec -> Q a) - -> Q a -withDataFamInstCon dficName f = do - dficInfo <- reify dficName - case dficInfo of - DataConI _ _ parentName _ -> do - parentInfo <- reify parentName - case parentInfo of - FamilyI (FamilyD DataFam _ _ _) _ -> withDataFam parentName $ \tvbs decs -> - let sameDefDec = fromJust . flip find decs $ \dec -> - case dec of - DataInstD _ _ _ cons _ -> any ((dficName ==) . constructorName) cons - NewtypeInstD _ _ _ con _ -> dficName == constructorName con - _ -> error $ ns ++ "Must be a data or newtype instance." - in f parentName tvbs sameDefDec - _ -> error $ ns ++ "Data constructor " ++ S.show dficName ++ " is not from a data family instance." - other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data family instance constructor." - where - ns :: String - ns = "Text.Show.Text.TH.withDataFamInstCon: " -#endif - --- | Extracts the information about the constructors from several @data@ or @newtype@ --- declarations. -decCons :: [Dec] -> [Con] -decCons decs = flip concatMap decs $ \dec -> case dec of - DataInstD _ _ _ cons _ -> cons - NewtypeInstD _ _ _ con _ -> [con] - _ -> error $ "Text.Show.Text.TH.decCons: Must be a data or newtype instance." - --- | Extracts the name of a constructor. -constructorName :: Con -> Name -constructorName (NormalC name _ ) = name -constructorName (RecC name _ ) = name -constructorName (InfixC _ name _ ) = name -constructorName (ForallC _ _ con) = constructorName con - --- | Extracts the name from a type variable binder. -tvbName :: TyVarBndr -> Name -tvbName (PlainTV name ) = name -tvbName (KindedTV name _) = name - --- | Applies a typeclass to several type parameters to produce the type predicate of --- an instance declaration. -applyCon :: Name -> [Name] -> Q [Pred] -applyCon con typeNames = return $ map apply typeNames - where - apply :: Name -> Pred - apply t = -#if MIN_VERSION_template_haskell(2,10,0) - AppT (ConT con) (VarT t) -#else - ClassP con [VarT t] -#endif - --- | Generates a declaration defining the 'showbPrec' function, followed by any custom --- pragma declarations specified by the 'PragmaOptions' argument. --- --- The Template Haskell API for generating pragmas (as well as GHC's treatment of --- pragmas themselves) have changed considerably over the years, so there's a lot of --- CPP magic required to get this to work uniformly across different versions of GHC. -showbPrecDecs :: PragmaOptions -> [Con] -> [Q Dec] -#if __GLASGOW_HASKELL__ >= 702 -showbPrecDecs opts cons = -#else -showbPrecDecs _ cons = -#endif - [ funD 'showbPrec [ clause [] - (normalB $ consToShow cons) - [] - ] - ] ++ inlineShowbPrecDec - ++ inlineShowbDec - ++ inlineShowbListDec - ++ specializeDecs - where - inlineShowbPrecDec, inlineShowbDec, inlineShowbListDec :: [Q Dec] -#if __GLASGOW_HASKELL__ >= 702 - inlineShowbPrecDec = inline inlineShowbPrec 'showbPrec - inlineShowbDec = inline inlineShowb 'showb - inlineShowbListDec = inline inlineShowbList 'showbList -#else - inlineShowbPrecDec = [] - inlineShowbDec = [] - inlineShowbListDec = [] -#endif - -#if __GLASGOW_HASKELL__ >= 702 - inline :: (PragmaOptions -> Bool) -> Name -> [Q Dec] - inline isInlining funName - | isInlining opts = [ pragInlD funName -# if MIN_VERSION_template_haskell(2,8,0) - Inline FunLike AllPhases -# else - (inlineSpecNoPhase True False) -# endif - ] - | otherwise = [] -#endif - - specializeDecs :: [Q Dec] -#if MIN_VERSION_template_haskell(2,8,0) - specializeDecs = (map . fmap) (PragmaD - . SpecialiseInstP - . AppT (ConT ''T.Show) - ) - (specializeTypes opts) -#else - -- There doesn't appear to be an equivalent of SpecialiseInstP in early - -- versions Template Haskell. - specializeDecs = [] -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE TemplateHaskell #-}+{-|+Module: Text.Show.Text.TH.Internal+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Functions to mechanically derive 'T.Show' instances or splice+@show@-related expressions into Haskell source code. You need to enable+the @TemplateHaskell@ language extension in order to use this module.++This implementation is based off of the @Data.Aeson.TH@ module from the+@aeson@ library.+-}+module Text.Show.Text.TH.Internal (+ -- * @deriveShow@+ -- $deriveShow+ deriveShow+ , deriveShowPragmas+ -- * @mk@ functions+ -- $mk+ , mkShow+ , mkShowLazy+ , mkShowPrec+ , mkShowPrecLazy+ , mkShowList+ , mkShowListLazy+ , mkShowb+ , mkShowbPrec+ , mkShowbList+ , mkPrint+ , mkPrintLazy+ , mkHPrint+ , mkHPrintLazy+ -- * Advanced pragma options+ , PragmaOptions(..)+ , defaultPragmaOptions+ , defaultInlineShowbPrec+ , defaultInlineShowb+ , defaultInlineShowbList+ ) where++import Data.List (foldl', intersperse)+#if MIN_VERSION_template_haskell(2,7,0)+import Data.List (find)+import Data.Maybe (fromJust)+#endif+import Data.Monoid.Compat ((<>))+import qualified Data.Text as TS ()+import qualified Data.Text.IO as TS (putStrLn, hPutStrLn)+import Data.Text.Lazy (toStrict)+import Data.Text.Lazy.Builder (fromString, toLazyText)+import qualified Data.Text.Lazy as TL ()+import qualified Data.Text.Lazy.IO as TL (putStrLn, hPutStrLn)++import GHC.Exts (Char(..), Double(..), Float(..), Int(..), Word(..))+import GHC.Prim (Char#, Double#, Float#, Int#, Word#)+import GHC.Show (appPrec, appPrec1)++import Language.Haskell.TH+import Language.Haskell.TH.Syntax (lift)++import Prelude ()+import Prelude.Compat hiding (Show)++import qualified Text.Show as S (Show(show))+import qualified Text.Show.Text.Classes as T+import Text.Show.Text.Classes (showb, showbPrec, showbListWith,+ showbParen, showbSpace)+#if __GLASGOW_HASKELL__ > 702+import Text.Show.Text.Classes (showbList)+#endif+import Text.Show.Text.Utils (isInfixTypeCon, isTupleString, s)++{- $deriveShow++'deriveShow' automatically generates a 'T.Show' instance declaration for a @data@+type, a @newtype@, a data family instance, or a whole data family. This emulates what+would (hypothetically) happen if you could attach a @deriving 'T.Show'@ clause to the+end of a data declaration.++Here are some examples of how to derive simple data types:++@+{-# LANGUAGE TemplateHaskell #-}+import Text.Show.Text.TH (deriveShow)++data Letter = A | B | C+$('deriveShow' ''Letter) -- instance Show Letter where ...++newtype Box a = Box a+$('deriveShow' ''Box) -- instance Show a => Show (Box a) where ...+@++If you are using @template-haskell-2.7.0.0@ or later, 'deriveShow' can also be used+to derive 'T.Show' instances for data families. Some examples:++@+{-# LANGUAGE FlexibleInstances, TemplateHaskell, TypeFamilies #-}+import Text.Show.Text.TH (deriveShow)++class AssocClass a where+ data AssocData a+instance AssocClass Int where+ data AssocData Int = AssocDataInt Int Int+instance AssocClass Char where+ newtype AssocData Char = AssocDataChar Char+$('deriveShow' 'AssocDataChar) -- Only one single quote!+-- Generates a Show instance for AssocDataChar, but not AssocDataInt++data family DataFam a+data instance DataFam Int = DataFamInt Int Int+newtype instance DataFam Char = DataFamChar Char+$('deriveShow' ''DataFam) -- Two single quotes!+-- Generates Show instances for all data instances of DataFam+-- (DataFamInt and DataFamChar)+@++Note that at the moment, there are some limitations to this approach:++* The 'Name' argument to 'deriveShow' must not be a type synonym.++* 'deriveShow' makes the assumption that all type variables in a data type require a+ 'T.Show' constraint when creating the type context. For example, if you have @data+ Phantom a = Phantom@, then @('deriveShow' ''Phantom)@ will generate @instance+ 'T.Show' a => 'T.Show' (Phantom a) where@, even though @'T.Show' a@ is not required.+ If you want a proper 'T.Show' instance for @Phantom@, you will need to use+ 'mkShowbPrec' (see the documentation of the 'mk' functions for more information).++* 'deriveShow' lacks the ability to properly detect data types with higher-kinded+ type parameters (e.g., @data HK f a = HK (f a)@) or with kinds other than @*@+ (e.g., @data List a (empty :: Bool)@). If you wish to derive 'T.Show'+ instances for these data types, you will need to use 'mkShowbPrec' (see the+ documentation of the 'mk' functions for more information).++* Some data constructors have arguments whose 'T.Show' instance depends on a+ typeclass besides 'T.Show'. For example, consider @newtype MyFixed a = MyFixed+ (Fixed a)@. @'Fixed' a@ is a 'T.Show' instance only if @a@ is an instance of both+ @HasResolution@ and 'T.Show'. Unfortunately, 'deriveShow' cannot infer that 'a' must+ be an instance of 'HasResolution', so it cannot create a 'T.Show' instance for+ @MyFixed@. However, you can use 'mkShowbPrec' to get around this (see the+ documentation of the 'mk' functions for more information).++-}++-- | Generates a 'T.Show' instance declaration for the given data type or family.+-- +-- /Since: 0.3/+deriveShow :: Name -- ^ Name of the data type to make an instance of 'T.Show'+ -> Q [Dec]+deriveShow = deriveShowPragmas defaultPragmaOptions++-- | Generates a 'T.Show' instance declaration for the given data type or family.+-- You shouldn't need to use this function unless you know what you are doing.+-- +-- Unlike 'deriveShow', this function allows configuration of whether to inline+-- 'showbPrec', 'showb', or 'showbList'. It also allows for specializing instances+-- certain types. For example:+-- +-- @+-- {-# LANGUAGE TemplateHaskell #-}+-- import Text.Show.Text.TH+-- +-- data ADT a = ADT a+-- $(deriveShowPragmas 'defaultInlineShowbPrec' {+-- specializeTypes = [ [t| ADT Int |] ]+-- }+-- ''ADT)+-- @+-- +-- This declararation would produce code like this:+-- +-- @+-- instance Show a => Show (ADT a) where+-- {-# INLINE showbPrec #-}+-- {-# SPECIALIZE instance Show (ADT Int) #-}+-- showbPrec = ...+-- @+-- +-- Beware: 'deriveShow' can generate extremely long code splices, so it may be unwise+-- to inline in some cases. Use with caution.+-- +-- /Since: 0.5/+deriveShowPragmas :: PragmaOptions -- ^ Specifies what pragmas to generate with this instance+ -> Name -- ^ Name of the data type to make an instance of 'T.Show'+ -> Q [Dec]+deriveShowPragmas opts name = do+ info <- reify name+ case info of+ TyConI{} -> deriveShowTyCon opts name+#if MIN_VERSION_template_haskell(2,7,0)+ DataConI{} -> deriveShowDataFamInst opts name+ FamilyI (FamilyD DataFam _ _ _) _ -> deriveShowDataFam opts name+ FamilyI (FamilyD TypeFam _ _ _) _ -> error $ ns ++ "Cannot use a type family name."+ -- TODO: Figure out how this whole multiline string business works+ _ -> error $ ns ++ "The name must be of a plain type constructor, data family, or data family instance constructor."+#else+ _ -> error $ ns ++ "The name must be of a plain type constructor."+#endif+ where+ ns :: String+ ns = "Text.Show.Text.TH.deriveShow: "++-- | Generates a 'T.Show' instance declaration for a plain type constructor.+deriveShowTyCon :: PragmaOptions+ -> Name+ -> Q [Dec]+deriveShowTyCon opts tyConName = withTyCon tyConName fromCons+ where+ fromCons :: [TyVarBndr] -> [Con] -> Q [Dec]+ fromCons tvbs cons = (:[]) <$>+ instanceD (applyCon ''T.Show typeNames)+ (appT (conT ''T.Show) instanceType)+ (showbPrecDecs opts cons)+ where+ typeNames :: [Name]+ typeNames = map tvbName tvbs+ + instanceType :: Q Type+ instanceType = foldl' appT (conT tyConName) $ map varT typeNames++#if MIN_VERSION_template_haskell(2,7,0)+-- | Generates a 'T.Show' instance declaration for a data family name.+deriveShowDataFam :: PragmaOptions+ -> Name+ -> Q [Dec]+deriveShowDataFam opts dataFamName = withDataFam dataFamName $ \tvbs decs ->+ flip mapM decs $ deriveShowDataFamFromDec opts dataFamName tvbs++-- | Generates a 'T.Show' instance declaration for a data family instance constructor.+deriveShowDataFamInst :: PragmaOptions+ -> Name+ -> Q [Dec]+deriveShowDataFamInst opts dataFamInstName = (:[]) <$>+ withDataFamInstCon dataFamInstName (deriveShowDataFamFromDec opts)++-- | Generates a single 'T.Show' instance declaration for a data family instance. This+-- code is used by 'deriveShowDataFam' and 'deriveShowDataFamInst' alike.+deriveShowDataFamFromDec :: PragmaOptions+ -> Name+ -> [TyVarBndr]+ -> Dec+ -> Q Dec+deriveShowDataFamFromDec opts parentName tvbs dec =+ instanceD (applyCon ''T.Show lhsTypeNames)+ (appT (conT ''T.Show) instanceType)+ (showbPrecDecs opts $ decCons [dec])+ where+ typeNames :: [Name]+ typeNames = map tvbName tvbs+ + -- It seems that Template Haskell's representation of the type variable binders+ -- in a data family instance declaration has changed considerably with each new+ -- version. Yikes.+ -- + -- In @template-haskell-2.8.0.0@, only the TyVarBndrs up to the rightmost non-type+ -- variable are provided, so we have to do some careful Name manipulation to get+ -- the LHS of the instance context just right.+ -- + -- Other versions of @template-haskell@ seem a bit more sensible.+ lhsTypeNames :: [Name]+# if !(MIN_VERSION_template_haskell(2,9,0)) || MIN_VERSION_template_haskell(2,10,0)+ lhsTypeNames = filterTyVars typeNames instTypes+# else+ lhsTypeNames = filterTyVars (take (length instTypes) typeNames) instTypes+ ++ drop (length instTypes) typeNames+# endif++ filterTyVars :: [Name] -> [Type] -> [Name]+ filterTyVars ns (SigT t _:ts) = filterTyVars ns (t:ts)+ filterTyVars (_:ns) (VarT n :ts) = n : filterTyVars ns ts+ filterTyVars (_:ns) (_ :ts) = filterTyVars ns ts+ filterTyVars [] _ = []+ filterTyVars _ [] = []++ rhsTypes :: [Type]+ rhsTypes = instTypes ++ drop (length instTypes) (map VarT typeNames)+ + instTypes :: [Type]+ instTypes = let tys = case dec of+ DataInstD _ _ tys' _ _ -> tys'+ NewtypeInstD _ _ tys' _ _ -> tys'+ _ -> error "Text.Show.Text.TH.deriveShow: The impossible happened."+# if MIN_VERSION_template_haskell(2,10,0)+ in tys+# else+ -- If PolyKinds is enabled, the first entries in this list will be+ -- kind signatures on early versions of GHC, so drop them+ in if length tys > length tvbs+ then drop (length tvbs) tys+ else tys+# endif++ instanceType :: Q Type+ instanceType = foldl' appT (conT parentName) $ map return rhsTypes+#endif++{- $mk++There may be scenarios in which you want to show an arbitrary data type or family+without having to make the type an instance of 'T.Show'. For these cases,+"Text.Show.Text.TH" provide several functions (all prefixed with @mk@) that splice+the appropriate lambda expression into your source code.++As an example, suppose you have @data ADT = ADT@, which is not an instance of 'T.Show'.+With @mkShow@, you can still convert it to 'Text':++@+{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}+import Text.Show.Text.TH (mkShow)++whichADT :: Bool+whichADT = $(mkShow ''ADT) ADT == \"ADT\"+@++'mk' functions are also useful for creating 'T.Show' instances for data types with+sophisticated type parameters. For example, 'deriveShow' cannot infer the correct type+context for @newtype HigherKinded f a = HigherKinded (f a)@, since @f@ is a+higher-kinded type parameter. However, it is still possible to derive a 'T.Show'+instance for @HigherKinded@ without too much trouble using 'mkShowbPrec':++@+{-# LANGUAGE FlexibleContexts, TemplateHaskell #-}+import Prelude hiding (Show)+import Text.Show.Text (Show(showbPrec))+import Text.Show.Text.TH (mkShowbPrec)++instance Show (f a) => Show (HigherKinded f a) where+ showbPrec = $(mkShowbPrec ''HigherKinded)+@++-}++-- | Generates a lambda expression which behaves like 'T.show' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShow :: Name -> Q Exp+mkShow name = [| toStrict . $(mkShowLazy name) |]++-- | Generates a lambda expression which behaves like 'T.showLazy' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShowLazy :: Name -> Q Exp+mkShowLazy name = [| toLazyText . $(mkShowb name) |]++-- | Generates a lambda expression which behaves like 'T.showPrec' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShowPrec :: Name -> Q Exp+mkShowPrec name = [| \p -> toStrict . $(mkShowPrecLazy name) p |]++-- | Generates a lambda expression which behaves like 'T.showPrecLazy' (without+-- requiring a 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShowPrecLazy :: Name -> Q Exp+mkShowPrecLazy name = [| \p -> toLazyText . $(mkShowbPrec name) p |]++-- | Generates a lambda expression which behaves like 'T.showList' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.5/+mkShowList :: Name -> Q Exp+mkShowList name = [| toStrict . $(mkShowListLazy name) |]++-- | Generates a lambda expression which behaves like 'T.showListLazy' (without+-- requiring a 'T.Show' instance).+-- +-- /Since: 0.5/+mkShowListLazy :: Name -> Q Exp+mkShowListLazy name = [| toLazyText . $(mkShowbList name) |]++-- | Generates a lambda expression which behaves like 'T.showb' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShowb :: Name -> Q Exp+mkShowb name = mkShowbPrec name `appE` [| zero |]+ where+ -- To prevent the generated TH code from having a type ascription+ zero :: Int+ zero = 0++-- | Generates a lambda expression which behaves like 'T.showPrec' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkShowbPrec :: Name -> Q Exp+mkShowbPrec name = do+ info <- reify name+ case info of+ TyConI{} -> withTyCon name $ \_ decs -> consToShow decs+#if MIN_VERSION_template_haskell(2,7,0)+ DataConI{} -> withDataFamInstCon name $ \_ _ dec ->+ consToShow $ decCons [dec]+ FamilyI (FamilyD DataFam _ _ _) _ -> withDataFam name $ \_ decs ->+ consToShow $ decCons decs+ FamilyI (FamilyD TypeFam _ _ _) _ -> error $ ns ++ "Cannot use a type family name."+ -- TODO: Figure out how this whole multiline string business works+ _ -> error $ ns ++ "The name must be of a plain type constructor, data family, or data family instance constructor."+#else+ _ -> error $ ns ++ "The name must be of a plain type constructor."+#endif+ where+ ns :: String+ ns = "Text.Show.Text.TH.mk: "++-- | Generates a lambda expression which behaves like 'T.showbList' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.5/+mkShowbList :: Name -> Q Exp+mkShowbList name = [| showbListWith $(mkShowb name) |]++-- | Generates a lambda expression which behaves like 'T.print' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkPrint :: Name -> Q Exp+mkPrint name = [| TS.putStrLn . $(mkShow name) |]++-- | Generates a lambda expression which behaves like 'T.printLazy' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkPrintLazy :: Name -> Q Exp+mkPrintLazy name = [| TL.putStrLn . $(mkShowLazy name) |]++-- | Generates a lambda expression which behaves like 'T.hPrint' (without requiring a+-- 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkHPrint :: Name -> Q Exp+mkHPrint name = [| \h -> TS.hPutStrLn h . $(mkShow name) |]++-- | Generates a lambda expression which behaves like 'T.hPrintLazy' (without+-- requiring a 'T.Show' instance).+-- +-- /Since: 0.3.1/+mkHPrintLazy :: Name -> Q Exp+mkHPrintLazy name = [| \h -> TL.hPutStrLn h . $(mkShowLazy name) |]++-- | Options that specify what @INLINE@ or @SPECIALIZE@ pragmas to generate with+-- a 'T.Show' instance.+-- +-- /Since: 0.5/+data PragmaOptions = PragmaOptions {+ inlineShowbPrec :: Bool -- ^ Whether to inline 'showbPrec'+ , inlineShowb :: Bool -- ^ Whether to inline 'showb'+ , inlineShowbList :: Bool -- ^ Whether to inline 'showbList'+ , specializeTypes :: [Q Type] -- ^ Types for which to create specialized instance declarations+}++-- | Do not generate any pragmas with a 'T.Show' instance.+-- +-- /Since: 0.5/+defaultPragmaOptions :: PragmaOptions+defaultPragmaOptions = PragmaOptions False False False []++-- | Inline the 'showbPrec' function in a 'T.Show' instance.+-- +-- /Since: 0.5/+defaultInlineShowbPrec :: PragmaOptions+defaultInlineShowbPrec = defaultPragmaOptions { inlineShowbPrec = True }++-- | Inline the 'showb' function in a 'T.Show' instance.+-- +-- /Since: 0.5/+defaultInlineShowb :: PragmaOptions+defaultInlineShowb = defaultPragmaOptions { inlineShowb = True }++-- | Inline the 'showbList' function in a 'T.Show' instance.+-- +-- /Since: 0.5/+defaultInlineShowbList :: PragmaOptions+defaultInlineShowbList = defaultPragmaOptions { inlineShowbList = True }++-- | Generates code to generate the 'T.Show' encoding of a number of constructors.+-- All constructors must be from the same type.+consToShow :: [Con] -> Q Exp+consToShow [] = error "Text.Show.Text.TH.consToShow: Not a single constructor given!"+consToShow cons = do+ p <- newName "p"+ value <- newName "value"+ lam1E (varP p)+ . lam1E (varP value)+ . caseE (varE value)+ $ map (encodeArgs p) cons++-- | Generates code to generate the 'T.Show' encoding of a single constructor.+encodeArgs :: Name -> Con -> Q Match+encodeArgs p (NormalC conName [])+ = match (conP conName [])+ (normalB [| intConst (fromString $(stringE (parenInfixConName conName ""))) $(varE p) |])+ []+encodeArgs p (NormalC conName [(_, argTy)]) = do+ arg <- newName "arg"+ + let showArg = showbPrecPrim appPrec1 argTy arg+ namedArg = [| fromString $(stringE (parenInfixConName conName " ")) <> $(showArg) |] + + match (conP conName [varP arg])+ (normalB [| showbParen ($(varE p) > $(lift appPrec)) $(namedArg) |])+ []+encodeArgs p (NormalC conName ts) = do+ args <- mapM newName ["arg" ++ S.show n | (_, n) <- zip ts [1 :: Int ..]]+ + if isNonUnitTuple conName+ then do+ let showArgs = map (appE [| showb |] . varE) args+ parenCommaArgs = [| s '(' |] : intersperse [| s ',' |] showArgs+ mappendArgs = foldr (`infixApp` [| (<>) |])+ [| s ')' |]+ parenCommaArgs+ + match (conP conName $ map varP args)+ (normalB [| intConst $(mappendArgs) $(varE p) |])+ []+ else do+ let showArgs = map (\(arg, (_, argTy)) -> showbPrecPrim appPrec1 argTy arg)+ (zip args ts)+ mappendArgs = foldr1 (\v q -> [| $(v) <> showbSpace <> $(q) |]) showArgs+ namedArgs = [| fromString $(stringE (parenInfixConName conName " ")) <> $(mappendArgs) |]+ + match (conP conName $ map varP args)+ (normalB [| showbParen ($(varE p) > $(lift appPrec)) $(namedArgs) |])+ []+encodeArgs p (RecC conName []) = encodeArgs p $ NormalC conName []+encodeArgs p (RecC conName ts) = do+ args <- mapM newName ["arg" ++ S.show n | (_, n) <- zip ts [1 :: Int ..]]+ + let showArgs = concatMap (\(arg, (argName, _, argTy))+ -> [ [| fromString $(stringE (nameBase argName ++ " = ")) |]+ , showbPrecPrim 0 argTy arg+ , [| fromString ", " |]+ ]+ )+ (zip args ts)+ braceCommaArgs = [| s '{' |] : take (length showArgs - 1) showArgs+ mappendArgs = foldr (`infixApp` [| (<>) |])+ [| s '}' |]+ braceCommaArgs+ namedArgs = [| fromString $(stringE (parenInfixConName conName " ")) <> $(mappendArgs) |]+ + match (conP conName $ map varP args)+ (normalB+#if __GLASGOW_HASKELL__ >= 711+ [| intConst $(namedArgs) $(varE p) |]+#else+ [| showbParen ($(varE p) > $(lift appPrec)) $(namedArgs) |]+#endif+ )+ []+encodeArgs p (InfixC (_, alTy) conName (_, arTy)) = do+ al <- newName "argL"+ ar <- newName "argR"+ info <- reify conName+ + let conPrec = case info of+ DataConI _ _ _ (Fixity prec _) -> prec+ other -> error $ "Text.Show.Text.TH.encodeArgs: Unsupported type: " ++ S.show other+ opName = nameBase conName+ infixOpE = if isInfixTypeCon opName+ then [| fromString $(stringE $ " " ++ opName ++ " " ) |]+ else [| fromString $(stringE $ " `" ++ opName ++ "` ") |]+ + match (infixP (varP al) conName (varP ar))+ (normalB $ appE [| showbParen ($(varE p) > conPrec) |]+ [| $(showbPrecPrim (conPrec + 1) alTy al)+ <> $(infixOpE)+ <> $(showbPrecPrim (conPrec + 1) arTy ar)+ |]+ )+ []+encodeArgs p (ForallC _ _ con) = encodeArgs p con++-------------------------------------------------------------------------------+-- Utility functions+-------------------------------------------------------------------------------++-- | Parenthesize an infix constructor name if it is being applied as a prefix+-- function (e.g., data Amp a = (:&) a a)+parenInfixConName :: Name -> ShowS+parenInfixConName conName =+ let conNameBase = nameBase conName+ in showParen (isInfixTypeCon conNameBase) $ showString conNameBase++-- | Checks if an type variable has an unlifted type that can be shown. If so,+-- wrap it in its corresponding constructor and show it. Otherwise, only show+-- the type variable.+showbPrecPrim :: Int -> Type -> Name -> Q Exp+#if __GLASGOW_HASKELL__ >= 711+-- Starting with GHC 7.10, data types containing unlifted types with derived @Show@+-- instances show hashed literals with actual hash signs, and negative hashed+-- literals are not surrounded with parentheses.+showbPrecPrim p (ConT tyName) tyVarName = showE+ where+ tyVarE :: Q Exp+ tyVarE = varE tyVarName+ + showE :: Q Exp+ showE | tyName == ''Char# = [| showbPrec 0 (C# $(tyVarE)) <> s '#' |]+ | tyName == ''Double# = [| showbPrec 0 (D# $(tyVarE)) <> fromString "##" |]+ | tyName == ''Float# = [| showbPrec 0 (F# $(tyVarE)) <> s '#' |]+ | tyName == ''Int# = [| showbPrec 0 (I# $(tyVarE)) <> s '#' |]+ | tyName == ''Word# = [| showbPrec 0 (W# $(tyVarE)) <> fromString "##" |]+ | otherwise = [| showbPrec p $(tyVarE) |]+#else+showbPrecPrim p (ConT tyName) tyVarName = [| showbPrec p $(expr) |]+ where+ tyVarE :: Q Exp+ tyVarE = varE tyVarName+ + expr :: Q Exp+ expr | tyName == ''Char# = [| C# $(tyVarE) |]+ | tyName == ''Double# = [| D# $(tyVarE) |]+ | tyName == ''Float# = [| F# $(tyVarE) |]+ | tyName == ''Int# = [| I# $(tyVarE) |]+ | tyName == ''Word# = [| W# $(tyVarE) |]+ | otherwise = tyVarE+#endif+showbPrecPrim p _ tyVarName = [| showbPrec p $(varE tyVarName) |]++-- | Checks if a 'Name' represents a tuple type constructor (other than '()')+isNonUnitTuple :: Name -> Bool+isNonUnitTuple = isTupleString . nameBase++-- | A type-restricted version of 'const'. This is useful when generating the lambda+-- expression in 'mkShowbPrec' for a data type with only nullary constructors (since+-- the expression wouldn't depend on the precedence). For example, if you had @data+-- Nullary = Nullary@ and attempted to run @$(mkShowbPrec ''Nullary) Nullary@, simply+-- ignoring the precedence argument would cause the type signature of @$(mkShowbPrec+-- ''Nullary)@ to be @a -> Nullary -> Builder@, not @Int -> Nullary -> Builder@.+-- +-- To avoid this problem, after computing the 'Builder' @b@, we call @intConst b p@,+-- where @p@ is the precedence argument. This forces @p :: Int@.+intConst :: a -> Int -> a+intConst = const+{-# INLINE intConst #-}++-- | Extracts a plain type constructor's information.+withTyCon :: Name -- ^ Name of the plain type constructor+ -> ([TyVarBndr] -> [Con] -> Q a)+ -- ^ Function that generates the actual code. Will be applied+ -- to the type variable binders and constructors extracted+ -- from the given 'Name'.+ -> Q a+ -- ^ Resulting value in the 'Q'uasi monad.+withTyCon name f = do+ info <- reify name+ case info of+ TyConI dec ->+ case dec of+ DataD _ _ tvbs cons _ -> f tvbs cons+ NewtypeD _ _ tvbs con _ -> f tvbs [con]+ other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data type or newtype."+ _ -> error $ ns ++ "The name must be of a plain type constructor."+ where+ ns :: String+ ns = "Text.Show.Text.TH.withTyCon: "++#if MIN_VERSION_template_haskell(2,7,0)+-- | Extracts a data family name's information.+withDataFam :: Name+ -> ([TyVarBndr] -> [Dec] -> Q a)+ -> Q a+withDataFam name f = do+ info <- reify name+ case info of+ FamilyI (FamilyD DataFam _ tvbs _) decs -> f tvbs decs+ FamilyI (FamilyD TypeFam _ _ _) _ ->+ error $ ns ++ "Cannot use a type family name."+ other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data family name."+ where+ ns :: String+ ns = "Text.Show.Text.TH.withDataFam: "++-- | Extracts a data family instance constructor's information.+withDataFamInstCon :: Name+ -> (Name -> [TyVarBndr] -> Dec -> Q a)+ -> Q a+withDataFamInstCon dficName f = do+ dficInfo <- reify dficName+ case dficInfo of+ DataConI _ _ parentName _ -> do+ parentInfo <- reify parentName+ case parentInfo of+ FamilyI (FamilyD DataFam _ _ _) _ -> withDataFam parentName $ \tvbs decs ->+ let sameDefDec = fromJust . flip find decs $ \dec ->+ case dec of+ DataInstD _ _ _ cons _ -> any ((dficName ==) . constructorName) cons + NewtypeInstD _ _ _ con _ -> dficName == constructorName con+ _ -> error $ ns ++ "Must be a data or newtype instance."+ in f parentName tvbs sameDefDec+ _ -> error $ ns ++ "Data constructor " ++ S.show dficName ++ " is not from a data family instance."+ other -> error $ ns ++ "Unsupported type " ++ S.show other ++ ". Must be a data family instance constructor."+ where+ ns :: String+ ns = "Text.Show.Text.TH.withDataFamInstCon: "+#endif++-- | Extracts the information about the constructors from several @data@ or @newtype@+-- declarations.+decCons :: [Dec] -> [Con]+decCons decs = flip concatMap decs $ \dec -> case dec of+ DataInstD _ _ _ cons _ -> cons+ NewtypeInstD _ _ _ con _ -> [con]+ _ -> error "Text.Show.Text.TH.decCons: Must be a data or newtype instance."++-- | Extracts the name of a constructor.+constructorName :: Con -> Name+constructorName (NormalC name _ ) = name+constructorName (RecC name _ ) = name+constructorName (InfixC _ name _ ) = name+constructorName (ForallC _ _ con) = constructorName con++-- | Extracts the name from a type variable binder.+tvbName :: TyVarBndr -> Name+tvbName (PlainTV name ) = name+tvbName (KindedTV name _) = name++-- | Applies a typeclass to several type parameters to produce the type predicate of+-- an instance declaration.+applyCon :: Name -> [Name] -> Q [Pred]+applyCon con typeNames = return $ map apply typeNames+ where+ apply :: Name -> Pred+ apply t =+#if MIN_VERSION_template_haskell(2,10,0)+ AppT (ConT con) (VarT t)+#else+ ClassP con [VarT t]+#endif++-- | Generates a declaration defining the 'showbPrec' function, followed by any custom+-- pragma declarations specified by the 'PragmaOptions' argument.+-- +-- The Template Haskell API for generating pragmas (as well as GHC's treatment of+-- pragmas themselves) have changed considerably over the years, so there's a lot of+-- CPP magic required to get this to work uniformly across different versions of GHC.+showbPrecDecs :: PragmaOptions -> [Con] -> [Q Dec]+#if __GLASGOW_HASKELL__ > 702+showbPrecDecs opts cons =+#else+showbPrecDecs _ cons =+#endif+ [ funD 'showbPrec [ clause []+ (normalB $ consToShow cons)+ []+ ]+ ] ++ inlineShowbPrecDec+ ++ inlineShowbDec+ ++ inlineShowbListDec+ ++ specializeDecs+ where+ inlineShowbPrecDec, inlineShowbDec, inlineShowbListDec :: [Q Dec]+#if __GLASGOW_HASKELL__ > 702+ inlineShowbPrecDec = inline inlineShowbPrec 'showbPrec+ inlineShowbDec = inline inlineShowb 'showb+ inlineShowbListDec = inline inlineShowbList 'showbList+#else+ inlineShowbPrecDec = []+ inlineShowbDec = []+ inlineShowbListDec = []+#endif+ +#if __GLASGOW_HASKELL__ > 702+ inline :: (PragmaOptions -> Bool) -> Name -> [Q Dec]+ inline isInlining funName+ | isInlining opts = [ pragInlD funName+# if MIN_VERSION_template_haskell(2,8,0)+ Inline FunLike AllPhases+# else+ (inlineSpecNoPhase True False)+# endif+ ]+ | otherwise = []+#endif+ + specializeDecs :: [Q Dec]+#if MIN_VERSION_template_haskell(2,8,0)+ specializeDecs = (fmap . fmap) (PragmaD+ . SpecialiseInstP+ . AppT (ConT ''T.Show)+ )+ (specializeTypes opts)+#else+ -- There doesn't appear to be an equivalent of SpecialiseInstP in early+ -- versions Template Haskell.+ specializeDecs = []+#endif
− src/Text/Show/Text/Text.hs
@@ -1,13 +0,0 @@-{-| -Module: Text.Show.Text.Text -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Imports 'Show' instances for @Text@ modules. --} -module Text.Show.Text.Text () where - -import Text.Show.Text.Text.Read ()
src/Text/Show/Text/Text/Read.hs view
@@ -1,79 +1,79 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Text.Show.Text.Text.Read -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Monomorphic 'Show' function for 'Lexeme' (and 'Number', if using a -recent-enough version of @base@). - -/Since: 0.3/ --} -module Text.Show.Text.Text.Read ( - showbLexemePrec -#if MIN_VERSION_base(4,7,0) - , showbNumberPrec -#endif - ) where - -import Data.Text.Lazy.Builder (Builder) - -import Prelude hiding (Show) - -import Text.Read.Lex (Lexeme(..)) -#if MIN_VERSION_base(4,7,0) -import Text.Read.Lex (Number) -#endif -import Text.Show.Text.Classes (Show(showbPrec), showbUnary) -#if MIN_VERSION_base(4,6,0) -import Text.Show.Text.Classes (FromStringShow(..)) -#else -import Text.Show.Text.Data.Integral () -import Text.Show.Text.Data.Ratio () -#endif -import Text.Show.Text.Data.Char () -import Text.Show.Text.Data.List () - -#include "inline.h" - --- | Convert a 'Lexeme' to a 'Builder' with the given precedence. --- --- /Since: 0.3/ -showbLexemePrec :: Int -> Lexeme -> Builder -showbLexemePrec p (Char c) = showbUnary "Char" p c -showbLexemePrec p (String s) = showbUnary "String" p s -showbLexemePrec p (Punc pun) = showbUnary "Punc" p pun -showbLexemePrec p (Ident i) = showbUnary "Ident" p i -showbLexemePrec p (Symbol s) = showbUnary "Symbol" p s -#if MIN_VERSION_base(4,6,0) -showbLexemePrec p (Number n) = showbUnary "Number" p $ FromStringShow n -#else -showbLexemePrec p (Int i) = showbUnary "Int" p i -showbLexemePrec p (Rat r) = showbUnary "Rat" p r -#endif -showbLexemePrec _ EOF = "EOF" - -#if MIN_VERSION_base(4,7,0) --- | Convert a 'Number' to a 'Builder' with the given precedence. --- This function is only available with @base-4.7.0.0@ or later. --- --- /Since: 0.3/ -showbNumberPrec :: Int -> Number -> Builder -showbNumberPrec p = showbPrec p . FromStringShow -{-# INLINE showbNumberPrec #-} -#endif - -instance Show Lexeme where - showbPrec = showbLexemePrec - INLINE_INST_FUN(showbPrec) - -#if MIN_VERSION_base(4,7,0) -instance Show Number where - showbPrec = showbNumberPrec - {-# INLINE showbPrec #-} -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-|+Module: Text.Show.Text.Text.Read+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Monomorphic 'Show' function for 'Lexeme' (and 'Number', if using a+recent-enough version of @base@).++/Since: 0.3/+-}+module Text.Show.Text.Text.Read (+ showbLexemePrec+#if MIN_VERSION_base(4,7,0)+ , showbNumberPrec+#endif+ ) where++import Data.Text.Lazy.Builder (Builder)++import Prelude hiding (Show)++import Text.Read.Lex (Lexeme(..))+#if MIN_VERSION_base(4,7,0)+import Text.Read.Lex (Number)+#endif+import Text.Show.Text.Classes (Show(showbPrec), showbUnary)+#if MIN_VERSION_base(4,6,0)+import Text.Show.Text.Classes (FromStringShow(..))+#else+import Text.Show.Text.Data.Integral ()+import Text.Show.Text.Data.Ratio ()+#endif+import Text.Show.Text.Data.Char ()+import Text.Show.Text.Data.List ()++#include "inline.h"++-- | Convert a 'Lexeme' to a 'Builder' with the given precedence.+-- +-- /Since: 0.3/+showbLexemePrec :: Int -> Lexeme -> Builder+showbLexemePrec p (Char c) = showbUnary "Char" p c+showbLexemePrec p (String s) = showbUnary "String" p s+showbLexemePrec p (Punc pun) = showbUnary "Punc" p pun+showbLexemePrec p (Ident i) = showbUnary "Ident" p i+showbLexemePrec p (Symbol s) = showbUnary "Symbol" p s+#if MIN_VERSION_base(4,6,0)+showbLexemePrec p (Number n) = showbUnary "Number" p $ FromStringShow n+#else+showbLexemePrec p (Int i) = showbUnary "Int" p i+showbLexemePrec p (Rat r) = showbUnary "Rat" p r+#endif+showbLexemePrec _ EOF = "EOF"++#if MIN_VERSION_base(4,7,0)+-- | Convert a 'Number' to a 'Builder' with the given precedence.+-- This function is only available with @base-4.7.0.0@ or later.+-- +-- /Since: 0.3/+showbNumberPrec :: Int -> Number -> Builder+showbNumberPrec p = showbPrec p . FromStringShow+{-# INLINE showbNumberPrec #-}+#endif++instance Show Lexeme where+ showbPrec = showbLexemePrec+ INLINE_INST_FUN(showbPrec)++#if MIN_VERSION_base(4,7,0)+instance Show Number where+ showbPrec = showbNumberPrec+ {-# INLINE showbPrec #-}+#endif
src/Text/Show/Text/Utils.hs view
@@ -1,94 +1,85 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-| -Module: Text.Show.Text.Utils -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Miscellaneous utility functions. --} -module Text.Show.Text.Utils where - -import Data.Int (Int64) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Monoid (Monoid(mappend, mempty)) -#endif -import Data.Text (Text) -import Data.Text.Lazy (length, toStrict, unpack) -import Data.Text.Lazy.Builder (Builder, singleton, toLazyText) - -import GHC.Exts (Char(C#), Int(I#)) -import GHC.Prim ((+#), chr#, ord#) - -import Prelude hiding (length, replicate) - --- | Unsafe conversion for decimal digits. -i2d :: Int -> Char -i2d (I# i#) = C# (chr# (ord# '0'# +# i#)) -{-# INLINE i2d #-} - -infixr 6 <> --- | Infix 'mappend', defined here for backwards-compatibility with older versions --- of @base@. -(<>) :: Monoid m => m -> m -> m -(<>) = mappend -{-# INLINE (<>) #-} - --- | Checks if a 'String' names a valid Haskell infix type constructor (i.e., does --- it begin with a colon?). -isInfixTypeCon :: String -> Bool -isInfixTypeCon (':':_) = True -isInfixTypeCon _ = False -{-# INLINE isInfixTypeCon #-} - --- | Checks if a 'String' represents a tuple (other than '()') -isTupleString :: String -> Bool -isTupleString ('(':',':_) = True -isTupleString _ = False -{-# INLINE isTupleString #-} - --- | A shorter name for 'singleton' for convenience's sake (since it tends to be used --- pretty often in @text-show@). -s :: Char -> Builder -s = singleton -{-# INLINE s #-} - --- | Computes the length of a 'Builder'. --- --- /Since: 0.3/ -lengthB :: Builder -> Int64 -lengthB = length . toLazyText -{-# INLINE lengthB #-} - --- | Convert a 'Builder' to a 'String' (without surrounding it with double quotes, --- as 'show' would). --- --- /Since: 0.4.1/ -toString :: Builder -> String -toString = unpack . toLazyText -{-# INLINE toString #-} - --- | Convert a 'Builder' to a strict 'Text'. --- --- /Since: 0.4.1/ -toText :: Builder -> Text -toText = toStrict . toLazyText -{-# INLINE toText #-} - --- | Merges several 'Builder's, separating them by newlines. --- --- /Since: 0.1/ -unlinesB :: [Builder] -> Builder -unlinesB (b:bs) = b <> s '\n' <> unlinesB bs -unlinesB [] = mempty - --- | Merges several 'Builder's, separating them by spaces. --- --- /Since: 0.1/ -unwordsB :: [Builder] -> Builder -unwordsB (b:bs@(_:_)) = b <> s ' ' <> unwordsB bs -unwordsB [b] = b -unwordsB [] = mempty +{-# LANGUAGE MagicHash #-}+{-|+Module: Text.Show.Text.Utils+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Miscellaneous utility functions.+-}+module Text.Show.Text.Utils where++import Data.Int (Int64)+import Data.Text (Text)+import Data.Monoid.Compat ((<>))+import Data.Text.Lazy (length, toStrict, unpack)+import Data.Text.Lazy.Builder (Builder, singleton, toLazyText)++import GHC.Exts (Char(C#), Int(I#))+import GHC.Prim ((+#), chr#, ord#)++import Prelude ()+import Prelude.Compat hiding (length)++-- | Unsafe conversion for decimal digits.+i2d :: Int -> Char+i2d (I# i#) = C# (chr# (ord# '0'# +# i#))+{-# INLINE i2d #-}++-- | Checks if a 'String' names a valid Haskell infix type constructor (i.e., does+-- it begin with a colon?).+isInfixTypeCon :: String -> Bool+isInfixTypeCon (':':_) = True+isInfixTypeCon _ = False+{-# INLINE isInfixTypeCon #-}++-- | Checks if a 'String' represents a tuple (other than '()')+isTupleString :: String -> Bool+isTupleString ('(':',':_) = True+isTupleString _ = False+{-# INLINE isTupleString #-}++-- | A shorter name for 'singleton' for convenience's sake (since it tends to be used+-- pretty often in @text-show@).+s :: Char -> Builder+s = singleton+{-# INLINE s #-}++-- | Computes the length of a 'Builder'.+-- +-- /Since: 0.3/+lengthB :: Builder -> Int64+lengthB = length . toLazyText+{-# INLINE lengthB #-}++-- | Convert a 'Builder' to a 'String' (without surrounding it with double quotes,+-- as 'show' would).+-- +-- /Since: 0.4.1/+toString :: Builder -> String+toString = unpack . toLazyText+{-# INLINE toString #-}++-- | Convert a 'Builder' to a strict 'Text'.+-- +-- /Since: 0.4.1/+toText :: Builder -> Text+toText = toStrict . toLazyText+{-# INLINE toText #-}++-- | Merges several 'Builder's, separating them by newlines.+-- +-- /Since: 0.1/+unlinesB :: [Builder] -> Builder+unlinesB (b:bs) = b <> s '\n' <> unlinesB bs+unlinesB [] = mempty++-- | Merges several 'Builder's, separating them by spaces.+-- +-- /Since: 0.1/+unwordsB :: [Builder] -> Builder+unwordsB (b:bs@(_:_)) = b <> s ' ' <> unwordsB bs+unwordsB [b] = b+unwordsB [] = mempty
tests/Derived.hs view
@@ -1,303 +1,463 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE ExistentialQuantification #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TypeOperators #-} -{-# LANGUAGE UndecidableInstances #-} -#if MIN_VERSION_template_haskell(2,7,0) -{-# LANGUAGE TypeFamilies #-} -#endif -#if __GLASGOW_HASKELL__ >= 706 --- GHC 7.4 also supports PolyKinds, but Template Haskell doesn't seem to play --- nicely with it for some reason. -{-# LANGUAGE PolyKinds #-} -#endif -#if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710 --- Starting with GHC 7.10, NullaryTypeClasses was deprecated in favor of --- MultiParamTypeClasses, which is already enabled -{-# LANGUAGE NullaryTypeClasses #-} -#endif -{-| -Module: Derived -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Defines data types with derived 'Show' instances (using "Text.Show.Text.TH") -for testing purposes. --} -module Derived ( - Nullary(..) - , PhantomNullary(..) - , MonomorphicUnary(..) - , PolymorphicUnary(..) - , MonomorphicProduct(..) - , PolymorphicProduct(..) - , MonomorphicRecord(..) - , PolymorphicRecord(..) - , MonomorphicInfix(..) - , PolymorphicInfix(..) - , MonomorphicForall(..) - , PolymorphicForall(..) - , AllAtOnce(..) - , GADT(..) - , PrimADT#(..) - , LeftAssocTree(..) - , RightAssocTree(..) - , (:?:)(..) - , HigherKindedTypeParams(..) - , Restriction(..) - , RestrictedContext(..) - , Fix(..) -#if MIN_VERSION_template_haskell(2,7,0) - , AllShow(..) - , NotAllShow(..) - , OneDataInstance(..) - , AssocClass1(..) - , AssocData1(..) - , AssocClass2(..) - , AssocData2(..) - -- , AssocClass3(..) - -- , AssocData3(..) -# if __GLASGOW_HASKELL__ >= 708 - , NullaryClass(..) - , NullaryData(..) -# endif - , GADTFam(..) -#endif - ) where - -import GHC.Generics (Generic) -import GHC.Prim (Char#, Double#, Float#, Int#, Word#) - -import Prelude hiding (Show) - -import Test.Tasty.QuickCheck (Arbitrary) - -import qualified Text.Show as S (Show) -import qualified Text.Show.Text as T (Show) - -data Nullary = Nullary deriving (S.Show, Generic) - -data PhantomNullary a = PhantomNullary deriving (S.Show, Generic) - -newtype MonomorphicUnary = MonomorphicUnary Int deriving (S.Show, Generic) - -newtype PolymorphicUnary a b = PolymorphicUnary a deriving (S.Show, Generic) - -data MonomorphicProduct = MonomorphicProduct Char Double Int deriving (S.Show, Generic) - -data PolymorphicProduct a b c d = PolymorphicProduct a b c deriving (S.Show, Generic) - -data MonomorphicRecord = MonomorphicRecord { - monomorphicRecord1 :: Char - , monomorphicRecord2 :: Double - , monomorphicRecord3 :: Int -} deriving (S.Show, Generic) - -data PolymorphicRecord a b c d = PolymorphicRecord { - polymorphicRecord1 :: a - , polymorphicRecord2 :: b - , polymorphicRecord3 :: c -} deriving (S.Show, Generic) - -infix 7 :/: -data MonomorphicInfix = Int :/: Double deriving (S.Show, Generic) - -infix 8 `PolyInf` -data PolymorphicInfix a b c = a `PolyInf` b deriving (S.Show, Generic) - --- TODO: Figure out how to create Generic instances for MonomorphicForall, PolymorphicForall, --- AllAtOnce, GADT, and PrimADT - -data MonomorphicForall = forall a. (Arbitrary a, S.Show a, T.Show a) => MonomorphicForall a -deriving instance S.Show MonomorphicForall - -data PolymorphicForall a b = forall c. (Arbitrary c, S.Show c, T.Show c) => PolymorphicForall a c -deriving instance S.Show a => S.Show (PolymorphicForall a b) - -infix 3 :/\: -data AllAtOnce a b c d = AAONullary - | AAOUnary a - | AAOProduct a b c - | AAORecord { - aaoRecord1 :: a - , aaoRecord2 :: b - , aaoRecord3 :: c - } - | a :/\: b - | forall e. (Arbitrary e, S.Show e, T.Show e) => AAOForall a c e -deriving instance (S.Show a, S.Show b, S.Show c) => S.Show (AllAtOnce a b c d) - -data GADT a b c where - GADTCon1 :: GADT Char b c - GADTCon2 :: Double -> GADT Double Double c - GADTCon3 :: Int -> GADT Int String c - GADTCon4 :: a -> GADT a b c - GADTCon5 :: b -> GADT b b c -deriving instance (S.Show a, S.Show b) => S.Show (GADT a b c) - -infixr 5 `PrimInfixIntegral#`, `PrimInfixFloating#`, `PrimInfixChar#` -data PrimADT# a = PrimNormal# Int# Float# Double# Char# Word# - | PrimRecord# { - primRecordInt# :: Int# - , primRecordFloat# :: Float# - , primRecordDouble# :: Double# - , primRecordChar# :: Char# - , primRecordWord# :: Word# - } - | Int# `PrimInfixIntegral#` Word# - | Float# `PrimInfixFloating#` Double# - | Char# `PrimInfixChar#` Char# - | forall b. (Arbitrary b, S.Show b, T.Show b) - => PrimForall# b Int# Float# Double# Char# Word# -deriving instance S.Show (PrimADT# a) - -infixl 5 :<: -data LeftAssocTree a = LeftAssocLeaf a - | LeftAssocTree a :<: LeftAssocTree a - deriving (S.Show, Generic) - -infixl 5 :>: -data RightAssocTree a = RightAssocLeaf a - | RightAssocTree a :>: RightAssocTree a - deriving (S.Show, Generic) - -infix 4 :?: -data a :?: b = a :?: b deriving (S.Show, Generic) - -newtype HigherKindedTypeParams f a = HigherKindedTypeParams (f a) deriving (S.Show, Generic) - -newtype Restriction a = Restriction a deriving Generic -deriving instance (Read a, S.Show a) => S.Show (Restriction a) - -newtype RestrictedContext a = RestrictedContext (Restriction a) deriving (S.Show, Generic) - -newtype Fix f = Fix (f (Fix f)) deriving Generic -deriving instance S.Show (f (Fix f)) => S.Show (Fix f) - -#if MIN_VERSION_template_haskell(2,7,0) -infix 2 `ASInfix` -data family AllShow a b c d :: * -data instance AllShow () () c d = ASNullary - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) -newtype instance AllShow Int b c d = ASUnary Int - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) -data instance AllShow Bool Bool c d = ASProduct Bool Bool - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) -data instance AllShow Char Double c d = ASRecord { - asRecord1 :: Char - , asRecord2 :: Double - , asRecord3 :: c - } deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) -data instance AllShow Float Ordering c d = Float `ASInfix` Ordering - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) - -data family NotAllShow a b c d :: * -data instance NotAllShow () () () d = NASNoShow -data instance NotAllShow Int b Int d = NASShow1 Int Int - | NASShow2 b - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) - -infix 1 `ODIInfix` -data family OneDataInstance a b c d :: * -data instance OneDataInstance a b c d = ODINullary - | ODIUnary a - | ODIProduct a b - | ODIRecord { - odiRecord1 :: a - , odiRecord2 :: b - , odiRecord3 :: c - } - | a `ODIInfix` b - deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) - -class AssocClass1 a where - data AssocData1 a :: * -instance AssocClass1 () where - newtype AssocData1 () = AssocCon1 Int deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) - -class AssocClass2 a b c where - data AssocData2 a b c :: * -instance AssocClass2 () Int Int where - newtype AssocData2 () Int Int = AssocCon2 Int deriving ( S.Show -# if __GLASGOW_HASKELL__ >= 706 - {- Woraround for a bizarre bug in older GHCs -} - , Generic -# endif - ) - --- class AssocClass3 a b c where --- data AssocData3 a b c :: * --- instance AssocClass3 () b c where --- newtype AssocData3 () b c = AssocCon3 Int deriving ( S.Show --- # if __GLASGOW_HASKELL__ >= 706 --- {- Woraround for a bizarre bug in older GHCs -} --- , Generic --- # endif --- ) - -# if __GLASGOW_HASKELL__ >= 708 -class NullaryClass where - data NullaryData -instance NullaryClass where - newtype NullaryData = NullaryCon Int deriving (S.Show, Generic) -# endif - -data family GADTFam a b c :: * -data instance GADTFam a b c where - GADTFamCon1 :: GADTFam Char b c - GADTFamCon2 :: Double -> GADTFam Double Double c - GADTFamCon3 :: Int -> GADTFam Int String c - GADTFamCon4 :: a -> GADTFam a b c - GADTFamCon5 :: b -> GADTFam b b c -deriving instance (S.Show a, S.Show b) => S.Show (GADTFam a b c) -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE DeriveGeneric #-}+#endif++#if MIN_VERSION_template_haskell(2,7,0)+{-# LANGUAGE TypeFamilies #-}+#endif++#if __GLASGOW_HASKELL__ >= 706+-- GHC 7.4 also supports PolyKinds, but Template Haskell doesn't seem to play+-- nicely with it for some reason.+{-# LANGUAGE PolyKinds #-}+#endif++#if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710+-- Starting with GHC 7.10, NullaryTypeClasses was deprecated in favor of+-- MultiParamTypeClasses, which is already enabled+{-# LANGUAGE NullaryTypeClasses #-}+#endif++#if __GLASGOW_HASKELL__ >= 709 || \+ (__GLASGOW_HASKELL__ == 708 && \+ defined(__GLASGOW_HASKELL_PATCHLEVEL1__) && \+ __GLASGOW_HASKELL_PATCHLEVEL1__ == 4)+-- Workaround for https://ghc.haskell.org/trac/ghc/ticket/9563+# define LANGUAGE_DeriveGeneric1TypeFamilies+#endif+{-|+Module: Derived+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Defines data types with derived 'Show' instances (using "Text.Show.Text.TH")+for testing purposes.+-}+module Derived (+ Nullary(..)+ , PhantomNullary(..)+ , MonomorphicUnary(..)+ , PolymorphicUnary(..)+ , MonomorphicProduct(..)+ , PolymorphicProduct(..)+ , MonomorphicRecord(..)+ , PolymorphicRecord(..)+ , MonomorphicInfix(..)+ , PolymorphicInfix(..)+ , MonomorphicForall(..)+ , PolymorphicForall(..)+ , AllAtOnce(..)+ , NormalGADT(..)+ , ExistentialGADT(..)+ , PrimADT#(..)+ , LeftAssocTree(..)+ , RightAssocTree(..)+ , (:?:)(..)+ , HigherKindedTypeParams(..)+ , Restriction(..)+ , RestrictedContext(..)+ , Fix(..)+#if MIN_VERSION_template_haskell(2,7,0)+ , AllShow(..)+ , NotAllShow(..)+ , OneDataInstance(..)+ , AssocClass1(..)+ , AssocData1(..)+ , AssocClass2(..)+ , AssocData2(..)+ -- , AssocClass3(..)+ -- , AssocData3(..)+# if __GLASGOW_HASKELL__ >= 708+ , NullaryClass(..)+ , NullaryData(..)+# endif+ , GADTFam(..)+#endif+ ) where++#if __GLASGOW_HASKELL__ >= 702+import GHC.Generics (Generic)+# if __GLASGOW_HASKELL__ >= 706+import GHC.Generics (Generic1)+# endif+#endif+import GHC.Prim (Char#, Double#, Float#, Int#, Word#)++import Prelude hiding (Show)++import Test.QuickCheck (Arbitrary)++import qualified Text.Show as S (Show)+import qualified Text.Show.Text as T (Show)++data Nullary = Nullary+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++data PhantomNullary a = PhantomNullary+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 708+-- Won't work on GHC 7.6 due to a PolyKinds-related bug+ , Generic1+# endif+#endif+ )++newtype MonomorphicUnary = MonomorphicUnary Int+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++newtype PolymorphicUnary a b = PolymorphicUnary b+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++data MonomorphicProduct = MonomorphicProduct Char Double Int+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++data PolymorphicProduct a b c d = PolymorphicProduct a b d+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++data MonomorphicRecord = MonomorphicRecord {+ monomorphicRecord1 :: Char+ , monomorphicRecord2 :: Double+ , monomorphicRecord3 :: Int+} deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++infixr 5 :%%%:+data PolymorphicRecord a b c d = (:%%%:) {+ polymorphicRecord1 :: a+ , polymorphicRecord2 :: b+ , polymorphicRecord3 :: d+} deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++infix 7 :/:+data MonomorphicInfix = Int :/: Double+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++infix 8 `PolyInf`+data PolymorphicInfix a b c = a `PolyInf` c+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++data MonomorphicForall = forall a. (Arbitrary a, S.Show a, T.Show a) => MonomorphicForall a+deriving instance S.Show MonomorphicForall++data PolymorphicForall a b = forall c. (Arbitrary c, S.Show c, T.Show c) => PolymorphicForall a c+deriving instance S.Show a => S.Show (PolymorphicForall a b)++infix 3 :/\:+data AllAtOnce a b c d = AAONullary+ | AAOUnary a+ | AAOProduct a b c+ | AAORecord {+ aaoRecord1 :: a+ , aaoRecord2 :: b+ , aaoRecord3 :: c+ }+ | a :/\: b+ | forall e. (Arbitrary e, S.Show e, T.Show e) => AAOForall a c e+deriving instance (S.Show a, S.Show b, S.Show c) => S.Show (AllAtOnce a b c d)++infixr 1 :.+data NormalGADT where+ (:.) :: Int -> Int -> NormalGADT+ (:..) :: Int -> Int -> NormalGADT+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+#endif+ )++data ExistentialGADT a b c where+ GADTCon1 :: ExistentialGADT Char b c+ GADTCon2 :: Double -> ExistentialGADT Double Double c+ GADTCon3 :: Int -> ExistentialGADT Int String c+ GADTCon4 :: a -> ExistentialGADT a b c+ GADTCon5 :: b -> ExistentialGADT b b c+deriving instance (S.Show a, S.Show b) => S.Show (ExistentialGADT a b c)++infixr 5 `PrimInfixIntegral#`, `PrimInfixFloating#`, `PrimInfixChar#`+data PrimADT# a = PrimNormal# Int# Float# Double# Char# Word#+ | PrimRecord# {+ primRecordInt# :: Int#+ , primRecordFloat# :: Float#+ , primRecordDouble# :: Double#+ , primRecordChar# :: Char#+ , primRecordWord# :: Word#+ }+ | Int# `PrimInfixIntegral#` Word#+ | Float# `PrimInfixFloating#` Double#+ | Char# `PrimInfixChar#` Char#+ | forall b. (Arbitrary b, S.Show b, T.Show b)+ => PrimForall# b Int# Float# Double# Char# Word#+deriving instance S.Show (PrimADT# a)++infixl 5 :<:+data LeftAssocTree a = LeftAssocLeaf a+ | LeftAssocTree a :<: LeftAssocTree a+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++infixl 5 :>:+data RightAssocTree a = RightAssocLeaf a+ | RightAssocTree a :>: RightAssocTree a+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++infix 4 :?:+data a :?: b = (:?:) a b+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++newtype HigherKindedTypeParams f a = HigherKindedTypeParams (f a)+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 708+-- Won't work on GHC 7.6 due to a PolyKinds-related bug+ , Generic1+# endif+#endif+ )++newtype Restriction a = Restriction a+#if __GLASGOW_HASKELL__ >= 702+ deriving ( Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+ )+#endif+deriving instance (Read a, S.Show a) => S.Show (Restriction a)++newtype RestrictedContext a = RestrictedContext (Restriction a)+ deriving ( S.Show+#if __GLASGOW_HASKELL__ >= 702+ , Generic+# if __GLASGOW_HASKELL__ >= 706+ , Generic1+# endif+#endif+ )++newtype Fix f = Fix (f (Fix f))+#if __GLASGOW_HASKELL__ >= 702+ deriving (Generic)+#endif+deriving instance S.Show (f (Fix f)) => S.Show (Fix f)++#if MIN_VERSION_template_haskell(2,7,0)+infix 2 `ASInfix`+data family AllShow a b c d :: *+data instance AllShow () () c d = ASNullary+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )+newtype instance AllShow Int b c d = ASUnary Int+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )+data instance AllShow Bool Bool c d = ASProduct Bool Bool+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )+data instance AllShow Char Double c d = ASRecord {+ asRecord1 :: Char+ , asRecord2 :: Double+ , asRecord3 :: c+ } deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )+data instance AllShow Float Ordering c d = Float `ASInfix` Ordering+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )++data family NotAllShow a b c d :: *+data instance NotAllShow () () () d = NASNoShow+data instance NotAllShow Int b Int d = NASShow1 Int Int+ | NASShow2 b+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )++infix 1 `ODIInfix`+data family OneDataInstance a b c d :: *+data instance OneDataInstance a b c d = ODINullary+ | ODIUnary a+ | ODIProduct a b+ | ODIRecord {+ odiRecord1 :: a+ , odiRecord2 :: b+ , odiRecord3 :: c+ }+ | a `ODIInfix` b+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+ , Generic1+# endif+# endif+ )++class AssocClass1 a where+ data AssocData1 a :: *+instance AssocClass1 () where+ newtype AssocData1 () = AssocCon1 Int+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# endif+ )++class AssocClass2 a b c where+ data AssocData2 a b c :: *+instance AssocClass2 () Int Int where+ newtype AssocData2 () Int Int = AssocCon2 Int+ deriving ( S.Show+# if __GLASGOW_HASKELL__ >= 706+ , Generic+# endif+ )++-- TODO: Uncomment this when smarter the typeclass instance context solver is implemented+-- +-- class AssocClass3 a b c where+-- data AssocData3 a b c :: *+-- instance AssocClass3 () b c where+-- newtype AssocData3 () b c = AssocCon3 Int+-- deriving ( S.Show+-- # if __GLASGOW_HASKELL__ >= 706+-- , Generic+-- # if defined(LANGUAGE_DeriveGeneric1TypeFamilies)+-- , Generic1+-- # endif+-- # endif+-- )++# if __GLASGOW_HASKELL__ >= 708+class NullaryClass where+ data NullaryData+instance NullaryClass where+ newtype NullaryData = NullaryCon Int+ deriving (S.Show, Generic)+# endif++data family GADTFam a b c :: *+data instance GADTFam a b c where+ GADTFamCon1 :: GADTFam Char b c+ GADTFamCon2 :: Double -> GADTFam Double Double c+ GADTFamCon3 :: Int -> GADTFam Int String c+ GADTFamCon4 :: a -> GADTFam a b c+ GADTFamCon5 :: b -> GADTFam b b c+deriving instance (S.Show a, S.Show b) => S.Show (GADTFam a b c)+#endif
− tests/Instances/BaseAndFriends.hs
@@ -1,632 +0,0 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TypeOperators #-} -#if MIN_VERSION_base(4,7,0) -{-# LANGUAGE TypeFamilies #-} -# if !(MIN_VERSION_base(4,8,0)) -{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-} -# endif -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Instances.BaseAndFriends -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Provides 'Arbitrary' instances for data types located in @base@ and other -common libraries. This module also defines 'Show' instances for some data -types as well (e.g., those which do not derive 'Show' in older versions -of GHC). --} -module Instances.BaseAndFriends () where - -import Control.Applicative (Const(..), ZipList(..)) -#if !(MIN_VERSION_base(4,8,0)) -import Control.Applicative ((<*>), pure) -#endif -import Control.Exception -import Control.Monad.ST (ST, fixST) - -import Data.ByteString.Short (ShortByteString, pack) -import Data.Char (GeneralCategory(..)) -import qualified Data.Data as D (Fixity(..)) -import Data.Data (Constr, ConstrRep(..), DataRep(..), DataType, - mkConstr, mkDataType) -import Data.Dynamic (Dynamic, toDyn) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Functor ((<$>)) -#endif -#if defined(VERSION_transformers) -# if !(MIN_VERSION_transformers(0,4,0)) -import Data.Functor.Classes () -# endif -#endif -import Data.Functor.Identity (Identity(..)) -import Data.Monoid (All(..), Any(..), Dual(..), First(..), - Last(..), Product(..), Sum(..)) -#if MIN_VERSION_base(4,8,0) -import Data.Monoid (Alt(..)) -#endif -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) -import qualified Data.OldTypeable.Internal as OldT (TyCon(..), TypeRep(..)) -#endif -#if MIN_VERSION_base(4,6,0) -import Data.Ord (Down(..)) -#endif -import Data.Proxy (Proxy(..)) -import Data.Text.Lazy.Builder (Builder, fromString) -#if MIN_VERSION_base(4,7,0) -import Data.Coerce (Coercible) -import Data.Type.Coercion (Coercion(..)) -import Data.Type.Equality ((:~:)(..)) -#endif -import qualified Data.Typeable.Internal as NewT (TyCon(..), TypeRep(..)) -import Data.Version (Version(..)) - -import Foreign.C.Types -import Foreign.Ptr (FunPtr, IntPtr, Ptr, WordPtr, - castPtrToFunPtr, nullPtr, plusPtr, - ptrToIntPtr, ptrToWordPtr) - -import GHC.Conc (BlockReason(..), ThreadStatus(..)) -#if !(defined(__GHCJS__)) -# if defined(mingw32_HOST_OS) -import GHC.Conc.Windows (ConsoleEvent(..)) -# else -import GHC.Event (Event, evtRead, evtWrite) -# endif -#endif -import GHC.Fingerprint.Type (Fingerprint(..)) -import GHC.IO.Encoding.Failure (CodingFailureMode(..)) -import GHC.IO.Encoding.Types (CodingProgress(..)) -import GHC.IO.Exception (IOException(..), IOErrorType(..)) -import GHC.IO.Handle (HandlePosn(..)) -import qualified GHC.Generics as G (Fixity(..)) -import GHC.Generics (U1(..), Par1(..), Rec1(..), K1(..), - M1(..), (:+:)(..), (:*:)(..), (:.:)(..), - Associativity(..), Arity(..)) -#if MIN_VERSION_base(4,8,0) -import GHC.RTS.Flags -import GHC.StaticPtr (StaticPtrInfo(..)) -#endif -#if !(MIN_VERSION_base(4,8,0)) -import GHC.Show (appPrec, appPrec1) -#endif -import GHC.Stats (GCStats(..)) -#if MIN_VERSION_base(4,7,0) -import GHC.TypeLits (SomeNat, SomeSymbol, someNatVal, someSymbolVal) -#endif - -import Instances.Utils ((<@>)) - -import Numeric (showHex) -#if !(MIN_VERSION_QuickCheck(2,8,0) && MIN_VERSION_base(4,8,0)) -import Numeric.Natural (Natural) -#endif - -import System.Exit (ExitCode(..)) -import System.IO (BufferMode(..), IOMode(..), Newline(..), NewlineMode(..), - SeekMode(..), Handle, stdin, stdout, stderr) -import System.Posix.Types - -import Test.Tasty.QuickCheck (Arbitrary(arbitrary), Gen, - arbitraryBoundedEnum, oneof, suchThat) - -import Text.Read.Lex as Lex (Lexeme(..)) -#if MIN_VERSION_base(4,7,0) -import Data.Fixed (Fixed, E12) -import Text.Read.Lex (Number) -#endif -import Text.Show.Text (FromStringShow(..), FromTextShow(..)) -import Text.Show.Text.Generic (ConType(..)) - -#if MIN_VERSION_base(4,7,0) -import Numeric (showOct, showEFloat, showFFloat, showGFloat) -import Test.Tasty.QuickCheck (getNonNegative) -# if !(MIN_VERSION_base(4,8,0)) -import Data.Word (Word) -# endif -#else -import Data.Word (Word64) -#endif - -#include "HsBaseConfig.h" - -#if !(MIN_VERSION_QuickCheck(2,8,0) && MIN_VERSION_base(4,8,0)) -instance Arbitrary Natural where - arbitrary = fromInteger <$> arbitrary `suchThat` (>= 0) -#endif - -instance Arbitrary Builder where - arbitrary = fromString <$> arbitrary - -instance Arbitrary ShortByteString where - arbitrary = pack <$> arbitrary - -instance Arbitrary (Ptr a) where - arbitrary = plusPtr nullPtr <$> arbitrary - -instance Arbitrary (FunPtr a) where - arbitrary = castPtrToFunPtr <$> arbitrary - -instance Arbitrary IntPtr where - arbitrary = ptrToIntPtr <$> arbitrary - -instance Arbitrary WordPtr where - arbitrary = ptrToWordPtr <$> arbitrary - -instance Arbitrary GeneralCategory where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary Version where - arbitrary = Version <$> arbitrary <*> arbitrary - -instance Arbitrary SomeException where - arbitrary = SomeException <$> (arbitrary :: Gen AssertionFailed) - -instance Arbitrary IOException where - arbitrary = IOError <$> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - -deriving instance Bounded IOErrorType -deriving instance Enum IOErrorType -instance Arbitrary IOErrorType where - arbitrary = arbitraryBoundedEnum - -deriving instance Bounded ArithException -deriving instance Enum ArithException -instance Arbitrary ArithException where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary ArrayException where - arbitrary = oneof [ IndexOutOfBounds <$> arbitrary - , UndefinedElement <$> arbitrary - ] - -instance Arbitrary AssertionFailed where - arbitrary = AssertionFailed <$> arbitrary - -#if MIN_VERSION_base(4,7,0) -instance Arbitrary SomeAsyncException where - arbitrary = SomeAsyncException <$> (arbitrary :: Gen AsyncException) -#endif - -deriving instance Bounded AsyncException -deriving instance Enum AsyncException -instance Arbitrary AsyncException where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary NonTermination where - arbitrary = pure NonTermination - -instance Arbitrary NestedAtomically where - arbitrary = pure NestedAtomically - -instance Arbitrary BlockedIndefinitelyOnMVar where - arbitrary = pure BlockedIndefinitelyOnMVar - -instance Arbitrary BlockedIndefinitelyOnSTM where - arbitrary = pure BlockedIndefinitelyOnSTM - -#if MIN_VERSION_base(4,8,0) -instance Arbitrary AllocationLimitExceeded where - arbitrary = pure AllocationLimitExceeded -#endif - -instance Arbitrary Deadlock where - arbitrary = pure Deadlock - -instance Arbitrary NoMethodError where - arbitrary = NoMethodError <$> arbitrary - -instance Arbitrary PatternMatchFail where - arbitrary = PatternMatchFail <$> arbitrary - -instance Arbitrary RecConError where - arbitrary = RecConError <$> arbitrary - -instance Arbitrary RecSelError where - arbitrary = RecSelError <$> arbitrary - -instance Arbitrary RecUpdError where - arbitrary = RecUpdError <$> arbitrary - --- ErrorCall is a newtype starting with base-4.7.0.0, but we'll --- manually derive Arbitrary to support older versions of GHC. -instance Arbitrary ErrorCall where - arbitrary = ErrorCall <$> arbitrary - -deriving instance Bounded MaskingState -deriving instance Enum MaskingState -instance Arbitrary MaskingState where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary Lexeme where - arbitrary = oneof [ Char <$> arbitrary - , String <$> arbitrary - , Punc <$> arbitrary - , Ident <$> arbitrary - , Symbol <$> arbitrary -#if MIN_VERSION_base(4,7,0) - , Number <$> arbitrary -#elif !(MIN_VERSION_base(4,6,0)) - , Int <$> arbitrary - , Rat <$> arbitrary -#endif - , pure Lex.EOF - ] - -#if MIN_VERSION_base(4,7,0) -instance Arbitrary Number where - arbitrary = do - str <- oneof [ show <$> (nonneg :: Gen Double) - , fmap (\d -> showEFloat Nothing d "") (nonneg :: Gen Double) - , fmap (\d -> showFFloat Nothing d "") (nonneg :: Gen Double) - , fmap (\d -> showGFloat Nothing d "") (nonneg :: Gen Double) - , show <$> (nonneg :: Gen Float) - , show <$> (nonneg :: Gen Int) - , fmap (\i -> "0x" ++ showHex i "") (nonneg :: Gen Int) - , fmap (\i -> "0o" ++ showOct i "") (nonneg :: Gen Int) - , show <$> (nonneg :: Gen Integer) - , show <$> (nonneg :: Gen Word) - , show <$> (nonneg :: Gen (Fixed E12)) - ] - let Number num = read str - pure num - where - nonneg :: (Arbitrary a, Num a, Ord a) => Gen a - nonneg = getNonNegative <$> arbitrary -#endif - -instance Arbitrary (Proxy s) where - arbitrary = pure Proxy - -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) -instance Arbitrary OldT.TypeRep where - arbitrary = OldT.TypeRep <$> arbitrary <*> arbitrary <@> [] --- arbitrary = OldT.TypeRep <$> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary OldT.TyCon where - arbitrary = OldT.TyCon <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary -#endif - -instance Arbitrary NewT.TypeRep where - arbitrary = NewT.TypeRep <$> arbitrary <*> arbitrary -#if MIN_VERSION_base(4,8,0) - <@> [] <@> [] -#else - <@> [] -#endif - -instance Arbitrary NewT.TyCon where - arbitrary = NewT.TyCon <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary Fingerprint where - arbitrary = Fingerprint <$> arbitrary <*> arbitrary - -#if !(MIN_VERSION_base(4,7,0)) -instance Show Fingerprint where - show (Fingerprint w1 w2) = hex16 w1 ++ hex16 w2 - where - -- Formats a 64 bit number as 16 digits hex. - hex16 :: Word64 -> String - hex16 i = let hex = showHex i "" - in replicate (16 - length hex) '0' ++ hex -#endif - -instance Arbitrary Dynamic where - arbitrary = toDyn <$> (arbitrary :: Gen Int) - -instance Arbitrary Constr where - arbitrary = mkConstr <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary ConstrRep where - arbitrary = oneof [ AlgConstr <$> arbitrary - , IntConstr <$> arbitrary - , FloatConstr <$> arbitrary - , CharConstr <$> arbitrary - ] - -instance Arbitrary DataRep where - arbitrary = oneof [ AlgRep <$> arbitrary - , pure IntRep - , pure FloatRep - , pure CharRep - , pure NoRep - ] - -instance Arbitrary DataType where - arbitrary = mkDataType <$> arbitrary <*> arbitrary - -deriving instance Bounded D.Fixity -deriving instance Enum D.Fixity -instance Arbitrary D.Fixity where - arbitrary = arbitraryBoundedEnum - -#if MIN_VERSION_base(4,7,0) -instance Coercible a b => Arbitrary (Coercion a b) where - arbitrary = pure Coercion - -instance a ~ b => Arbitrary (a :~: b) where - arbitrary = pure Refl -#endif - -deriving instance Bounded BlockReason -deriving instance Enum BlockReason -instance Arbitrary BlockReason where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary ThreadStatus where - arbitrary = oneof [ pure ThreadRunning - , pure ThreadFinished - , ThreadBlocked <$> arbitrary - , pure ThreadDied - ] - -#if !(defined(__GHCJS__)) -# if defined(mingw32_HOST_OS) -deriving instance Bounded ConsoleEvent -instance Arbitrary ConsoleEvent where - arbitrary = arbitraryBoundedEnum -# else -instance Arbitrary Event where - arbitrary = oneof $ map pure [evtRead, evtWrite] - --- TODO: instance Arbitrary FdKey -# endif -#endif - -instance Arbitrary (ST s a) where - arbitrary = pure $ fixST undefined - -instance Arbitrary Handle where - arbitrary = oneof $ map pure [stdin, stdout, stderr] - -instance Arbitrary HandlePosn where - arbitrary = HandlePosn <$> arbitrary <*> arbitrary - -deriving instance Bounded IOMode -instance Arbitrary IOMode where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary BufferMode where - arbitrary = oneof [ pure NoBuffering - , pure LineBuffering - , BlockBuffering <$> arbitrary - ] - -deriving instance Bounded SeekMode -instance Arbitrary SeekMode where - arbitrary = arbitraryBoundedEnum - -deriving instance Bounded Newline -deriving instance Enum Newline -instance Arbitrary Newline where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary NewlineMode where - arbitrary = NewlineMode <$> arbitrary <*> arbitrary - -deriving instance Bounded CodingProgress -deriving instance Enum CodingProgress -instance Arbitrary CodingProgress where - arbitrary = arbitraryBoundedEnum - -deriving instance Bounded CodingFailureMode -deriving instance Enum CodingFailureMode -instance Arbitrary CodingFailureMode where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary GCStats where - arbitrary = GCStats <$> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary (U1 p) where - arbitrary = pure U1 - -instance Arbitrary p => Arbitrary (Par1 p) where - arbitrary = Par1 <$> arbitrary - -instance Arbitrary (f p) => Arbitrary (Rec1 f p) where - arbitrary = Rec1 <$> arbitrary - -instance Arbitrary c => Arbitrary (K1 i c p) where - arbitrary = K1 <$> arbitrary - -instance Arbitrary (f p) => Arbitrary (M1 i c f p) where - arbitrary = M1 <$> arbitrary - -instance (Arbitrary (f p), Arbitrary (g p)) => Arbitrary ((f :+: g) p) where - arbitrary = oneof [L1 <$> arbitrary, R1 <$> arbitrary] - -instance (Arbitrary (f p), Arbitrary (g p)) => Arbitrary ((f :*: g) p) where - arbitrary = (:*:) <$> arbitrary <*> arbitrary - -instance Arbitrary (f (g p)) => Arbitrary ((f :.: g) p) where - arbitrary = Comp1 <$> arbitrary - -instance Arbitrary G.Fixity where - arbitrary = oneof [pure G.Prefix, G.Infix <$> arbitrary <*> arbitrary] - -deriving instance Bounded Associativity -deriving instance Enum Associativity -instance Arbitrary Associativity where - arbitrary = arbitraryBoundedEnum - -instance Arbitrary Arity where - arbitrary = oneof [pure NoArity, Arity <$> arbitrary] - -#if !(MIN_VERSION_base(4,7,0)) -deriving instance Show (U1 p) -deriving instance Show p => Show (Par1 p) -deriving instance Show (f p) => Show (Rec1 f p) -deriving instance Show c => Show (K1 i c p) -deriving instance Show (f p) => Show (M1 i c f p) -deriving instance (Show (f p), Show (g p)) => Show ((f :+: g) p) - --- Due to a GHC bug (https://ghc.haskell.org/trac/ghc/ticket/9830), this Show --- instance produces output with the wrong precedence on older versions of GHC. --- I'll manually define the Show instance to get the correct behavior. -instance (Show (f p), Show (g p)) => Show ((f :*: g) p) where - showsPrec p (l :*: r) = showParen (p > prec) $ - showsPrec (prec + 1) l - . showString " :*: " - . showsPrec (prec + 1) r - where prec = 6 - -deriving instance Show (f (g p)) => Show ((f :.: g) p) -#endif - -#if MIN_VERSION_base(4,8,0) -instance Arbitrary ConcFlags where - arbitrary = ConcFlags <$> arbitrary <*> arbitrary - -instance Arbitrary MiscFlags where - arbitrary = MiscFlags <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary DebugFlags where - arbitrary = DebugFlags <$> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - <*> arbitrary <*> arbitrary <*> arbitrary - -instance Arbitrary TickyFlags where - arbitrary = TickyFlags <$> arbitrary <*> arbitrary - -instance Arbitrary StaticPtrInfo where - arbitrary = StaticPtrInfo <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary -#endif - --- #if MIN_VERSION_base(4,6,0) && !(MIN_VERSION_base(4,7,0)) --- TODO: instance Arbitrary (IsZero n) --- TODO: instance Arbitrary (IsEven n) --- #endif - -#if MIN_VERSION_base(4,7,0) -instance Arbitrary SomeNat where - arbitrary = do - nat <- arbitrary `suchThat` (>= 0) - case someNatVal nat of - Just sn -> pure sn - Nothing -> fail "Negative natural number" - -instance Arbitrary SomeSymbol where - arbitrary = someSymbolVal <$> arbitrary -#endif - -instance Arbitrary ConType where - arbitrary = oneof [pure Rec, pure Tup, pure Pref, Inf <$> arbitrary] - -deriving instance Arbitrary CChar -deriving instance Arbitrary CSChar -deriving instance Arbitrary CUChar -deriving instance Arbitrary CShort -deriving instance Arbitrary CUShort -deriving instance Arbitrary CInt -deriving instance Arbitrary CUInt -deriving instance Arbitrary CLong -deriving instance Arbitrary CULong -deriving instance Arbitrary CLLong -deriving instance Arbitrary CULLong -deriving instance Arbitrary CFloat -deriving instance Arbitrary CDouble -deriving instance Arbitrary CPtrdiff -deriving instance Arbitrary CSize -deriving instance Arbitrary CWchar -deriving instance Arbitrary CSigAtomic -deriving instance Arbitrary CClock -deriving instance Arbitrary CTime -deriving instance Arbitrary CUSeconds -deriving instance Arbitrary CSUSeconds -deriving instance Arbitrary CIntPtr -deriving instance Arbitrary CUIntPtr -deriving instance Arbitrary CIntMax -deriving instance Arbitrary CUIntMax - -instance Arbitrary ExitCode where - arbitrary = oneof [pure ExitSuccess, ExitFailure <$> arbitrary] - -#if defined(HTYPE_DEV_T) -deriving instance Arbitrary CDev -#endif -#if defined(HTYPE_INO_T) -deriving instance Arbitrary CIno -#endif -#if defined(HTYPE_MODE_T) -deriving instance Arbitrary CMode -#endif -#if defined(HTYPE_OFF_T) -deriving instance Arbitrary COff -#endif -#if defined(HTYPE_PID_T) -deriving instance Arbitrary CPid -#endif -#if defined(HTYPE_SSIZE_T) -deriving instance Arbitrary CSsize -#endif -#if defined(HTYPE_GID_T) -deriving instance Arbitrary CGid -#endif -#if defined(HTYPE_NLINK_T) -deriving instance Arbitrary CNlink -#endif -#if defined(HTYPE_UID_T) -deriving instance Arbitrary CUid -#endif -#if defined(HTYPE_CC_T) -deriving instance Arbitrary CCc -#endif -#if defined(HTYPE_SPEED_T) -deriving instance Arbitrary CSpeed -#endif -#if defined(HTYPE_TCFLAG_T) -deriving instance Arbitrary CTcflag -#endif -#if defined(HTYPE_RLIM_T) -deriving instance Arbitrary CRLim -#endif -deriving instance Arbitrary Fd - -deriving instance Arbitrary All -deriving instance Arbitrary Any -deriving instance Arbitrary a => Arbitrary (Dual a) -deriving instance Arbitrary a => Arbitrary (First a) -deriving instance Arbitrary a => Arbitrary (Last a) -deriving instance Arbitrary a => Arbitrary (Product a) -deriving instance Arbitrary a => Arbitrary (Sum a) -#if MIN_VERSION_base(4,8,0) -deriving instance Arbitrary (f a) => Arbitrary (Alt f a) -#endif - -deriving instance Arbitrary a => Arbitrary (Const a b) -#if !(MIN_VERSION_base(4,8,0)) -instance Show a => Show (Const a b) where - showsPrec p (Const x) = showParen (p > appPrec) - $ showString "Const " . showsPrec appPrec1 x -#endif -deriving instance Arbitrary a => Arbitrary (ZipList a) -#if !(MIN_VERSION_base(4,7,0)) -deriving instance Show a => Show (ZipList a) -#endif - -#if MIN_VERSION_base(4,6,0) -deriving instance Arbitrary a => Arbitrary (Down a) -#if !(MIN_VERSION_base(4,7,0)) -deriving instance Show a => Show (Down a) -#endif -#endif - -deriving instance Arbitrary a => Arbitrary (Identity a) - -deriving instance Arbitrary a => Arbitrary (FromStringShow a) -deriving instance Arbitrary a => Arbitrary (FromTextShow a)
+ tests/Instances/Control/Applicative.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Control.Applicative+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Control.Applicative" module.+-}+module Instances.Control.Applicative () where++import Control.Applicative (Const(..), ZipList(..))+import Test.QuickCheck (Arbitrary)++deriving instance Arbitrary a => Arbitrary (Const a b)+deriving instance Arbitrary a => Arbitrary (ZipList a)
+ tests/Instances/Control/Concurrent.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Control.Concurrent+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Control.Concurrent" module.+-}+module Instances.Control.Concurrent () where++import GHC.Conc (BlockReason(..), ThreadStatus(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)++deriving instance Bounded BlockReason+deriving instance Enum BlockReason+instance Arbitrary BlockReason where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary ThreadStatus where+ arbitrary = oneof [ pure ThreadRunning+ , pure ThreadFinished+ , ThreadBlocked <$> arbitrary+ , pure ThreadDied+ ]
+ tests/Instances/Control/Exception.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Control.Exception+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Control.Exception" module.+-}+module Instances.Control.Exception () where++import Control.Exception++import GHC.IO.Exception (IOException(..), IOErrorType(..))++import Instances.Foreign.C.Types ()+import Instances.System.IO ()++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), Gen, arbitraryBoundedEnum, oneof)++instance Arbitrary SomeException where+ arbitrary = SomeException <$> (arbitrary :: Gen AssertionFailed)++instance Arbitrary IOException where+ arbitrary = IOError <$> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary++deriving instance Bounded IOErrorType+deriving instance Enum IOErrorType+instance Arbitrary IOErrorType where+ arbitrary = arbitraryBoundedEnum++deriving instance Bounded ArithException+deriving instance Enum ArithException+instance Arbitrary ArithException where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary ArrayException where+ arbitrary = oneof [ IndexOutOfBounds <$> arbitrary+ , UndefinedElement <$> arbitrary+ ]++instance Arbitrary AssertionFailed where+ arbitrary = AssertionFailed <$> arbitrary++#if MIN_VERSION_base(4,7,0)+instance Arbitrary SomeAsyncException where+ arbitrary = SomeAsyncException <$> (arbitrary :: Gen AsyncException)+#endif++deriving instance Bounded AsyncException+deriving instance Enum AsyncException+instance Arbitrary AsyncException where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary NonTermination where+ arbitrary = pure NonTermination++instance Arbitrary NestedAtomically where+ arbitrary = pure NestedAtomically++instance Arbitrary BlockedIndefinitelyOnMVar where+ arbitrary = pure BlockedIndefinitelyOnMVar++instance Arbitrary BlockedIndefinitelyOnSTM where+ arbitrary = pure BlockedIndefinitelyOnSTM++#if MIN_VERSION_base(4,8,0)+instance Arbitrary AllocationLimitExceeded where+ arbitrary = pure AllocationLimitExceeded+#endif++instance Arbitrary Deadlock where+ arbitrary = pure Deadlock++instance Arbitrary NoMethodError where+ arbitrary = NoMethodError <$> arbitrary++instance Arbitrary PatternMatchFail where+ arbitrary = PatternMatchFail <$> arbitrary++instance Arbitrary RecConError where+ arbitrary = RecConError <$> arbitrary++instance Arbitrary RecSelError where+ arbitrary = RecSelError <$> arbitrary++instance Arbitrary RecUpdError where+ arbitrary = RecUpdError <$> arbitrary++-- ErrorCall is a newtype starting with base-4.7.0.0, but we'll+-- manually derive Arbitrary to support older versions of GHC.+instance Arbitrary ErrorCall where+ arbitrary = ErrorCall <$> arbitrary++deriving instance Bounded MaskingState+deriving instance Enum MaskingState+instance Arbitrary MaskingState where+ arbitrary = arbitraryBoundedEnum
+ tests/Instances/Control/Monad/ST.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Control.Monad.ST+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'ST'.+-}+module Instances.Control.Monad.ST () where++import Control.Monad.ST (ST, fixST)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary (ST s a) where+ arbitrary = pure $ fixST undefined
+ tests/Instances/Data/ByteString.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.ByteString+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'ShortByteString'.+-}+module Instances.Data.ByteString () where++import Data.ByteString.Short (ShortByteString, pack)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary ShortByteString where+ arbitrary = pack <$> arbitrary
+ tests/Instances/Data/Char.hs view
@@ -0,0 +1,19 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Char+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'GeneralCategory'.+-}+module Instances.Data.Char () where++import Data.Char (GeneralCategory)+import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum)++instance Arbitrary GeneralCategory where+ arbitrary = arbitraryBoundedEnum
+ tests/Instances/Data/Data.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Data+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Data.Data" module.+-}+module Instances.Data.Data () where++import Data.Data (Constr, ConstrRep(..), DataRep(..), DataType,+ Fixity(..), mkConstr, mkDataType)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)++instance Arbitrary Constr where+ arbitrary = mkConstr <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++instance Arbitrary ConstrRep where+ arbitrary = oneof [ AlgConstr <$> arbitrary+ , IntConstr <$> arbitrary+ , FloatConstr <$> arbitrary+ , CharConstr <$> arbitrary+ ]++instance Arbitrary DataRep where+ arbitrary = oneof [ AlgRep <$> arbitrary+ , pure IntRep+ , pure FloatRep+ , pure CharRep+ , pure NoRep+ ]++instance Arbitrary DataType where+ arbitrary = mkDataType <$> arbitrary <*> arbitrary++deriving instance Bounded Fixity+deriving instance Enum Fixity+instance Arbitrary Fixity where+ arbitrary = arbitraryBoundedEnum
+ tests/Instances/Data/Dynamic.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Dynamic+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Dynamic'.+-}+module Instances.Data.Dynamic () where++import Data.Dynamic (Dynamic, toDyn)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), Gen)++instance Arbitrary Dynamic where+ arbitrary = toDyn <$> (arbitrary :: Gen Int)
+ tests/Instances/Data/Floating.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Floating+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'FPFormat'.+-}+module Instances.Data.Floating () where++import Data.Text.Lazy.Builder.RealFloat (FPFormat(..))+import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum)++deriving instance Bounded FPFormat+instance Arbitrary FPFormat where+ arbitrary = arbitraryBoundedEnum
+ tests/Instances/Data/Functor/Identity.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Functor.Identity+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Identity'.+-}+module Instances.Data.Functor.Identity () where++import Data.Functor.Identity (Identity(..))+import Test.QuickCheck (Arbitrary)++deriving instance Arbitrary a => Arbitrary (Identity a)
+ tests/Instances/Data/Monoid.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}++#if MIN_VERSION_base(4,8,0)+{-# LANGUAGE FlexibleContexts #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Monoid+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Data.Monoid" module.+-}+module Instances.Data.Monoid () where++import Data.Monoid+import Test.QuickCheck (Arbitrary)++deriving instance Arbitrary All+deriving instance Arbitrary Any+deriving instance Arbitrary a => Arbitrary (Dual a)+deriving instance Arbitrary a => Arbitrary (First a)+deriving instance Arbitrary a => Arbitrary (Last a)+deriving instance Arbitrary a => Arbitrary (Product a)+deriving instance Arbitrary a => Arbitrary (Sum a)+#if MIN_VERSION_base(4,8,0)+deriving instance Arbitrary (f a) => Arbitrary (Alt f a)+#endif
+ tests/Instances/Data/OldTypeable.hs view
@@ -0,0 +1,37 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}+#endif++{-|+Module: Instances.Data.OldTypeable+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Data.OldTypeable" module.+-}+module Instances.Data.OldTypeable () where++#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+import Data.OldTypeable.Internal (TyCon(..), TypeRep(..))++import Instances.GHC.Fingerprint ()+import Instances.Utils ((<@>))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary TypeRep where+ arbitrary = TypeRep <$> arbitrary <*> arbitrary <@> []+-- arbitrary = TypeRep <$> arbitrary <*> arbitrary <*> arbitrary++instance Arbitrary TyCon where+ arbitrary = TyCon <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+#endif
+ tests/Instances/Data/Ord.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Ord+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Down'.+-}+module Instances.Data.Ord () where++#if MIN_VERSION_base(4,6,0)+import Data.Ord (Down(..))+import Test.QuickCheck (Arbitrary)++deriving instance Arbitrary a => Arbitrary (Down a)+#endif
+ tests/Instances/Data/Proxy.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Proxy+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for 'Proxy'.+-}+module Instances.Data.Proxy () where++import Data.Proxy (Proxy(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary (Proxy s) where+ arbitrary = pure Proxy
+ tests/Instances/Data/Text.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Text+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the @text@ library.+-}+module Instances.Data.Text () where++import Data.Text.Encoding.Error (UnicodeException(..))+import Data.Text.Foreign (I16)+import Data.Text.Lazy.Builder (Builder, fromString)++#if MIN_VERSION_text(1,0,0)+import Data.Text.Encoding (Decoding(..))+import Instances.Utils ((<@>))+#endif++#if MIN_VERSION_text(1,1,0)+import Data.Text.Internal.Fusion.Size (Size, exactSize)+import Test.QuickCheck (getNonNegative)+#endif++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum)+import Test.QuickCheck.Instances ()++instance Arbitrary Builder where+ arbitrary = fromString <$> arbitrary++instance Arbitrary I16 where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary UnicodeException where+ arbitrary = DecodeError <$> arbitrary <*> arbitrary++#if MIN_VERSION_text(1,0,0)+instance Arbitrary Decoding where+ arbitrary = Some <$> arbitrary <*> arbitrary <@> undefined+#endif++#if MIN_VERSION_text(1,1,0)+instance Arbitrary Size where+ arbitrary = exactSize . getNonNegative <$> arbitrary+#endif
+ tests/Instances/Data/Tuple.hs view
@@ -0,0 +1,215 @@+{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 704+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE StandaloneDeriving #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Tuple+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for tuple types.+-}+module Instances.Data.Tuple () where++#if __GLASGOW_HASKELL__ >= 704+import GHC.Generics (Generic)+# if __GLASGOW_HASKELL__ >= 706+import GHC.Generics (Generic1)+# endif+#endif++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ ) => Arbitrary (a, b, c, d, e, f) where+ arbitrary = (,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ ) => Arbitrary (a, b, c, d, e, f, g) where+ arbitrary = (,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ ) => Arbitrary (a, b, c, d, e, f, g, h) where+ arbitrary = (,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ ) => Arbitrary (a, b, c, d, e, f, g, h, i) where+ arbitrary = (,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j) where+ arbitrary = (,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ , Arbitrary k+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k) where+ arbitrary = (,,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ , Arbitrary k+ , Arbitrary l+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k, l) where+ arbitrary = (,,,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ , Arbitrary k+ , Arbitrary l+ , Arbitrary m+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k, l, m) where+ arbitrary = (,,,,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ , Arbitrary k+ , Arbitrary l+ , Arbitrary m+ , Arbitrary n+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k, l, m, n) where+ arbitrary = (,,,,,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++instance ( Arbitrary a+ , Arbitrary b+ , Arbitrary c+ , Arbitrary d+ , Arbitrary e+ , Arbitrary f+ , Arbitrary g+ , Arbitrary h+ , Arbitrary i+ , Arbitrary j+ , Arbitrary k+ , Arbitrary l+ , Arbitrary m+ , Arbitrary n+ , Arbitrary o+ ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) where+ arbitrary = (,,,,,,,,,,,,,,)+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++#if __GLASGOW_HASKELL__ >= 704+deriving instance Generic (a, b, c, d, e, f, g, h)+deriving instance Generic (a, b, c, d, e, f, g, h, i)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)++# if __GLASGOW_HASKELL__ >= 706+deriving instance Generic1 ((,,,,,,,) a b c d e f g)+deriving instance Generic1 ((,,,,,,,,) a b c d e f g h)+deriving instance Generic1 ((,,,,,,,,,) a b c d e f g h i)+deriving instance Generic1 ((,,,,,,,,,,) a b c d e f g h i j)+deriving instance Generic1 ((,,,,,,,,,,,) a b c d e f g h i j k)+deriving instance Generic1 ((,,,,,,,,,,,,) a b c d e f g h i j k l)+deriving instance Generic1 ((,,,,,,,,,,,,,) a b c d e f g h i j k l m)+deriving instance Generic1 ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n)+deriving instance Generic1 ((,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o)+# endif+#endif
+ tests/Instances/Data/Type/Coercion.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Type.Coercion+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Coercion'.+-}+module Instances.Data.Type.Coercion () where++#if MIN_VERSION_base(4,7,0)+import Data.Coerce (Coercible)+import Data.Type.Coercion (Coercion(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Coercible a b => Arbitrary (Coercion a b) where+ arbitrary = pure Coercion+#endif
+ tests/Instances/Data/Type/Equality.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Type.Equality+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for '(:~:)'.+-}+module Instances.Data.Type.Equality () where++#if MIN_VERSION_base(4,7,0)+import Data.Type.Equality ((:~:)(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance a ~ b => Arbitrary (a :~: b) where+ arbitrary = pure Refl+#endif
+ tests/Instances/Data/Typeable.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Typeable+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Data.Typeable" module.+-}+module Instances.Data.Typeable () where++#if MIN_VERSION_base(4,4,0)+import Data.Typeable.Internal (TyCon(..), TypeRep(..))+import Instances.Utils ((<@>))+#else+import Data.Typeable (TyCon, TypeRep, mkTyCon, typeOf)+import Test.QuickCheck (Gen)+#endif++import Instances.GHC.Fingerprint ()++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary TypeRep where+#if MIN_VERSION_base(4,4,0)+ arbitrary = TypeRep <$> arbitrary+ <*> arbitrary+# if MIN_VERSION_base(4,8,0)+ <@> [] <@> []+# else+ <@> []+# endif+#else+ arbitrary = typeOf <$> (arbitrary :: Gen Int)+#endif++instance Arbitrary TyCon where+#if MIN_VERSION_base(4,4,0)+ arbitrary = TyCon <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+#else+ arbitrary = mkTyCon <$> arbitrary+#endif
+ tests/Instances/Data/Version.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Data.Version+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Version'.+-}+module Instances.Data.Version () where++import Data.Version (Version(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary Version where+ arbitrary = Version <$> arbitrary <*> arbitrary
tests/Instances/Derived.hs view
@@ -1,367 +1,380 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE TypeOperators #-} -{-# LANGUAGE UndecidableInstances #-} -#include "overlap.h" -__LANGUAGE_OVERLAPPING_INSTANCES__ -#if __GLASGOW_HASKELL__ >= 706 --- GHC 7.4 also supports PolyKinds, but Template Haskell doesn't seem to play --- -- nicely with it for some reason. -{-# LANGUAGE PolyKinds #-} -#endif -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-| -Module: Instances.Derived -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -Defines data types with derived 'Show' instances (using "Text.Show.Text.TH") -for testing purposes, including 'Arbitrary' instances. --} -module Instances.Derived ( - showbNullary - , showbPhantomNullary - , showbMonomorphicUnaryPrec - , showbPolymorphicUnaryPrec - , showbMonomorphicProductPrec - , showbPolymorphicProductPrec - , showbMonomorphicRecordPrec - , showbPolymorphicRecordPrec - , showbMonomorphicInfixPrec - , showbPolymorphicInfixPrec - , showbMonomorphicForallPrec - , showbPolymorphicForallPrec - , showbAllAtOncePrec - , showbGADTPrec - , showbPrimADTPrec# - , showbLeftAssocTreePrec - , showbRightAssocTreePrec - , showbQuestionMarkPrec --- , showbHigherKindedTypeParamsPrec --- , showbRestrictionPrec --- , showbRestrictedContextPrec --- , showbFixPrec -#if MIN_VERSION_template_haskell(2,7,0) - , showbASNullary - , showbASUnaryPrec - , showbASProductPrec - , showbASRecordPrec - , showbASInfixPrec - , showbNASShowPrec - , showbOneDataInstancePrec - , showbAssocData1Prec - , showbAssocData2Prec - -- , showbAssocData3Prec -# if __GLASGOW_HASKELL__ >= 708 - , showbNullaryDataPrec -# endif - , showbGADTFamPrec -#endif - ) where - -#if !(MIN_VERSION_base(4,8,0)) -import Control.Applicative ((<*>), pure) - -import Data.Functor ((<$>)) -#endif - -import Derived - -import GHC.Exts (Char(..), Double(..), Float(..), Int(..), Word(..)) - -import Prelude hiding (Show) - -import Test.Tasty.QuickCheck (Arbitrary(..), Gen, oneof) - -import Text.Show.Text (Show(showb, showbPrec), Builder) -import Text.Show.Text.TH (deriveShow, mkShowbPrec) - -showbNullary :: Nullary -> Builder -showbNullary = showb - -showbPhantomNullary :: Show a => PhantomNullary a -> Builder -showbPhantomNullary = showb - -showbMonomorphicUnaryPrec :: Int -> MonomorphicUnary -> Builder -showbMonomorphicUnaryPrec = showbPrec - -showbPolymorphicUnaryPrec :: (Show a, Show b) => Int -> PolymorphicUnary a b -> Builder -showbPolymorphicUnaryPrec = showbPrec - -showbMonomorphicProductPrec :: Int -> MonomorphicProduct -> Builder -showbMonomorphicProductPrec = showbPrec - -showbPolymorphicProductPrec :: (Show a, Show b, Show c, Show d) - => Int -> PolymorphicProduct a b c d -> Builder -showbPolymorphicProductPrec = showbPrec - -showbMonomorphicRecordPrec :: Int -> MonomorphicRecord -> Builder -showbMonomorphicRecordPrec = showbPrec - -showbPolymorphicRecordPrec :: (Show a, Show b, Show c, Show d) - => Int -> PolymorphicRecord a b c d -> Builder -showbPolymorphicRecordPrec = showbPrec - -showbMonomorphicInfixPrec :: Int -> MonomorphicInfix -> Builder -showbMonomorphicInfixPrec = showbPrec - -showbPolymorphicInfixPrec :: (Show a, Show b, Show c) - => Int -> PolymorphicInfix a b c -> Builder -showbPolymorphicInfixPrec = showbPrec - -showbMonomorphicForallPrec :: Int -> MonomorphicForall -> Builder -showbMonomorphicForallPrec = showbPrec - -showbPolymorphicForallPrec :: (Show a, Show b) => Int -> PolymorphicForall a b -> Builder -showbPolymorphicForallPrec = showbPrec - -showbAllAtOncePrec :: (Show a, Show b, Show c, Show d) - => Int -> AllAtOnce a b c d -> Builder -showbAllAtOncePrec = showbPrec - -showbGADTPrec :: (Show a, Show b, Show c) => Int -> GADT a b c -> Builder -showbGADTPrec = showbPrec - -showbPrimADTPrec# :: Show a => Int -> PrimADT# a -> Builder -showbPrimADTPrec# = showbPrec - -showbLeftAssocTreePrec :: Show a => Int -> LeftAssocTree a -> Builder -showbLeftAssocTreePrec = showbPrec - -showbRightAssocTreePrec :: Show a => Int -> RightAssocTree a -> Builder -showbRightAssocTreePrec = showbPrec - -showbQuestionMarkPrec :: (Show a, Show b) => Int -> a :?: b -> Builder -showbQuestionMarkPrec = showbPrec - --- showbHigherKindedTypeParamsPrec :: Show (f a) --- => Int -> HigherKindedTypeParams f a -> Builder --- showbHigherKindedTypeParamsPrec = showbPrec --- --- showbRestrictionPrec :: (Read a, Show a) => Int -> Restriction a -> Builder --- showbRestrictionPrec = showbPrec --- --- showbRestrictedContextPrec :: (Read a, Show a) => Int -> RestrictedContext a -> Builder --- showbRestrictedContextPrec = showbPrec --- --- showbFixPrec :: Show (f (Fix f)) => Int -> Fix f -> Builder --- showbFixPrec = showbPrec - -#if MIN_VERSION_template_haskell(2,7,0) -showbASNullary :: (Show c, Show d) => AllShow () () c d -> Builder -showbASNullary = showb - -showbASUnaryPrec :: (Show b, Show c, Show d) => Int -> AllShow Int b c d -> Builder -showbASUnaryPrec = showbPrec - -showbASProductPrec :: (Show c, Show d) => Int -> AllShow Bool Bool c d -> Builder -showbASProductPrec = showbPrec - -showbASRecordPrec :: (Show c, Show d) => Int -> AllShow Char Double c d -> Builder -showbASRecordPrec = showbPrec - -showbASInfixPrec :: (Show c, Show d) => Int -> AllShow Float Ordering c d -> Builder -showbASInfixPrec = showbPrec - -showbNASShowPrec :: (Show b, Show d) => Int -> NotAllShow Int b Int d -> Builder -showbNASShowPrec = showbPrec - -showbOneDataInstancePrec :: (Show a, Show b, Show c, Show d) - => Int -> OneDataInstance a b c d -> Builder -showbOneDataInstancePrec = showbPrec - -showbAssocData1Prec :: Int -> AssocData1 () -> Builder -showbAssocData1Prec = showbPrec - -showbAssocData2Prec :: Int -> AssocData2 () Int Int -> Builder -showbAssocData2Prec = showbPrec - --- showbAssocData3Prec :: Int -> AssocData3 () b c -> Builder --- showbAssocData3Prec = showbPrec - -# if __GLASGOW_HASKELL__ >= 708 -showbNullaryDataPrec :: Int -> NullaryData -> Builder -showbNullaryDataPrec = showbPrec -# endif - -showbGADTFamPrec :: (Show a, Show b, Show c) => Int -> GADTFam a b c -> Builder -showbGADTFamPrec = showbPrec -#endif - -------------------------------------------------------------------------------- - -$(deriveShow ''Nullary) -instance Arbitrary Nullary where - arbitrary = pure Nullary - -$(deriveShow ''PhantomNullary) -instance Arbitrary (PhantomNullary a) where - arbitrary = pure PhantomNullary - -$(deriveShow ''MonomorphicUnary) -deriving instance Arbitrary MonomorphicUnary - -$(deriveShow ''PolymorphicUnary) -deriving instance Arbitrary a => Arbitrary (PolymorphicUnary a b) - -$(deriveShow ''MonomorphicProduct) -instance Arbitrary MonomorphicProduct where - arbitrary = MonomorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary - -$(deriveShow ''PolymorphicProduct) -instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (PolymorphicProduct a b c d) where - arbitrary = PolymorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary - -$(deriveShow ''MonomorphicRecord) -instance Arbitrary MonomorphicRecord where - arbitrary = MonomorphicRecord <$> arbitrary <*> arbitrary <*> arbitrary - -$(deriveShow ''PolymorphicRecord) -instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (PolymorphicRecord a b c d) where - arbitrary = PolymorphicRecord <$> arbitrary <*> arbitrary <*> arbitrary - -$(deriveShow ''MonomorphicInfix) -instance Arbitrary MonomorphicInfix where - arbitrary = (:/:) <$> arbitrary <*> arbitrary - -$(deriveShow ''PolymorphicInfix) -instance (Arbitrary a, Arbitrary b) => Arbitrary (PolymorphicInfix a b c) where - arbitrary = PolyInf <$> arbitrary <*> arbitrary - -$(deriveShow ''MonomorphicForall) -instance Arbitrary MonomorphicForall where - arbitrary = MonomorphicForall <$> (arbitrary :: Gen Int) - -$(deriveShow ''PolymorphicForall) -instance Arbitrary a => Arbitrary (PolymorphicForall a b) where - arbitrary = PolymorphicForall <$> arbitrary <*> (arbitrary :: Gen Int) - -$(deriveShow ''AllAtOnce) -instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (AllAtOnce a b c d) where - arbitrary = oneof [ pure AAONullary - , AAOUnary <$> arbitrary - , AAOProduct <$> arbitrary <*> arbitrary <*> arbitrary - , AAORecord <$> arbitrary <*> arbitrary <*> arbitrary - , (:/\:) <$> arbitrary <*> arbitrary - , AAOForall <$> arbitrary <*> arbitrary <*> (arbitrary :: Gen Int) - ] - -$(deriveShow ''GADT) -instance __OVERLAPPING__ Arbitrary (GADT Char b c) where - arbitrary = pure GADTCon1 -instance __OVERLAPPING__ Arbitrary (GADT Double Double c) where - arbitrary = GADTCon2 <$> arbitrary -instance __OVERLAPPING__ Arbitrary (GADT Int String c) where - arbitrary = GADTCon3 <$> arbitrary -instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (GADT a b c) where - arbitrary = GADTCon4 <$> arbitrary -instance __OVERLAPPING__ Arbitrary b => Arbitrary (GADT b b c) where - arbitrary = GADTCon5 <$> arbitrary - -$(deriveShow ''PrimADT#) -instance Arbitrary (PrimADT# a) where - arbitrary = do - i@(I# i#) <- arbitrary - F# f# <- arbitrary - D# d# <- arbitrary - C# c# <- arbitrary - W# w# <- arbitrary - oneof $ map pure [ PrimNormal# i# f# d# c# w# - , PrimRecord# i# f# d# c# w# - , i# `PrimInfixIntegral#` w# - , f# `PrimInfixFloating#` d# - , c# `PrimInfixChar#` c# - , PrimForall# i i# f# d# c# w# - ] - -$(deriveShow ''LeftAssocTree) -instance Arbitrary a => Arbitrary (LeftAssocTree a) where - arbitrary = oneof [ LeftAssocLeaf <$> arbitrary - , (:<:) <$> (LeftAssocLeaf <$> arbitrary) - <*> (LeftAssocLeaf <$> arbitrary) - ] - -$(deriveShow ''RightAssocTree) -instance Arbitrary a => Arbitrary (RightAssocTree a) where - arbitrary = oneof [ RightAssocLeaf <$> arbitrary - , (:>:) <$> (RightAssocLeaf <$> arbitrary) - <*> (RightAssocLeaf <$> arbitrary) - ] - -$(deriveShow ''(:?:)) -instance (Arbitrary a, Arbitrary b) => Arbitrary (a :?: b) where - arbitrary = (:?:) <$> arbitrary <*> arbitrary - -instance Show (f a) => Show (HigherKindedTypeParams f a) where - showbPrec = $(mkShowbPrec ''HigherKindedTypeParams) -deriving instance Arbitrary (f a) => Arbitrary (HigherKindedTypeParams f a) - -instance (Read a, Show a) => Show (Restriction a) where - showbPrec = $(mkShowbPrec ''Restriction) -deriving instance Arbitrary a => Arbitrary (Restriction a) - -instance (Read a, Show a) => Show (RestrictedContext a) where - showbPrec = $(mkShowbPrec ''RestrictedContext) -deriving instance Arbitrary a => Arbitrary (RestrictedContext a) - -instance Show (f (Fix f)) => Show (Fix f) where - showbPrec = $(mkShowbPrec ''Fix) -deriving instance Arbitrary (f (Fix f)) => Arbitrary (Fix f) - -#if MIN_VERSION_template_haskell(2,7,0) -$(deriveShow ''AllShow) -instance Arbitrary (AllShow () () c d) where - arbitrary = pure ASNullary -deriving instance Arbitrary (AllShow Int b c d) -instance Arbitrary (AllShow Bool Bool c d) where - arbitrary = ASProduct <$> arbitrary <*> arbitrary -instance Arbitrary c => Arbitrary (AllShow Char Double c d) where - arbitrary = ASRecord <$> arbitrary <*> arbitrary <*> arbitrary -instance Arbitrary (AllShow Float Ordering c d) where - arbitrary = ASInfix <$> arbitrary <*> arbitrary - -$(deriveShow 'NASShow1) -instance Arbitrary b => Arbitrary (NotAllShow Int b Int d) where - arbitrary = oneof [NASShow1 <$> arbitrary <*> arbitrary, NASShow2 <$> arbitrary] - -$(deriveShow ''OneDataInstance) -instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (OneDataInstance a b c d) where - arbitrary = oneof [ pure ODINullary - , ODIUnary <$> arbitrary - , ODIProduct <$> arbitrary <*> arbitrary - , ODIRecord <$> arbitrary <*> arbitrary <*> arbitrary - , ODIInfix <$> arbitrary <*> arbitrary - ] - -$(deriveShow ''AssocData1) -deriving instance Arbitrary (AssocData1 ()) - -$(deriveShow 'AssocCon2) -deriving instance Arbitrary (AssocData2 () Int Int) - -#if __GLASGOW_HASKELL__ >= 708 -$(deriveShow 'NullaryCon) -deriving instance Arbitrary NullaryData -#endif - -$(deriveShow 'GADTFamCon1) -instance __OVERLAPPING__ Arbitrary (GADTFam Char b c) where - arbitrary = pure GADTFamCon1 -instance __OVERLAPPING__ Arbitrary (GADTFam Double Double c) where - arbitrary = GADTFamCon2 <$> arbitrary -instance __OVERLAPPING__ Arbitrary (GADTFam Int String c) where - arbitrary = GADTFamCon3 <$> arbitrary -instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (GADTFam a b c) where - arbitrary = GADTFamCon4 <$> arbitrary -instance __OVERLAPPING__ Arbitrary b => Arbitrary (GADTFam b b c) where - arbitrary = GADTFamCon5 <$> arbitrary -#endif +{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}+#include "overlap.h"+__LANGUAGE_OVERLAPPING_INSTANCES__+#if __GLASGOW_HASKELL__ >= 706+-- GHC 7.4 also supports PolyKinds, but Template Haskell doesn't seem to play+-- nicely with it for some reason.+{-# LANGUAGE PolyKinds #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}+#if __GLASGOW_HASKELL__ >= 711+-- The TH deriving mechanism isn't smart enough at the moment to eliminate+-- redundant constraints in Show instance declarations.+{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}+#endif+{-|+Module: Instances.Derived+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Defines data types with derived 'Show' instances (using "Text.Show.Text.TH")+for testing purposes, including 'Arbitrary' instances.+-}+module Instances.Derived (+ showbNullary+ , showbPhantomNullary+ , showbMonomorphicUnaryPrec+ , showbPolymorphicUnaryPrec+ , showbMonomorphicProductPrec+ , showbPolymorphicProductPrec+ , showbMonomorphicRecordPrec+ , showbPolymorphicRecordPrec+ , showbMonomorphicInfixPrec+ , showbPolymorphicInfixPrec+ , showbMonomorphicForallPrec+ , showbPolymorphicForallPrec+ , showbAllAtOncePrec+ , showbNormalGADTPrec+ , showbExistentialGADTPrec+ , showbPrimADTPrec#+ , showbLeftAssocTreePrec+ , showbRightAssocTreePrec+ , showbQuestionMarkPrec+-- , showbHigherKindedTypeParamsPrec+-- , showbRestrictionPrec+-- , showbRestrictedContextPrec+-- , showbFixPrec+#if MIN_VERSION_template_haskell(2,7,0)+ , showbASNullary+ , showbASUnaryPrec+ , showbASProductPrec+ , showbASRecordPrec+ , showbASInfixPrec+ , showbNASShowPrec+ , showbOneDataInstancePrec+ , showbAssocData1Prec+ , showbAssocData2Prec+ -- , showbAssocData3Prec+# if __GLASGOW_HASKELL__ >= 708+ , showbNullaryDataPrec+# endif+ , showbGADTFamPrec+#endif+ ) where++import Derived++import GHC.Exts (Char(..), Double(..), Float(..), Int(..), Word(..))++import Prelude ()+import Prelude.Compat hiding (Show)++import Test.QuickCheck (Arbitrary(..), Gen, oneof)++import Text.Show.Text (Show(showb, showbPrec), Builder)+import Text.Show.Text.TH (deriveShow, mkShowbPrec)++showbNullary :: Nullary -> Builder+showbNullary = showb++showbPhantomNullary :: Show a => PhantomNullary a -> Builder+showbPhantomNullary = showb++showbMonomorphicUnaryPrec :: Int -> MonomorphicUnary -> Builder+showbMonomorphicUnaryPrec = showbPrec++showbPolymorphicUnaryPrec :: (Show a, Show b) => Int -> PolymorphicUnary a b -> Builder+showbPolymorphicUnaryPrec = showbPrec++showbMonomorphicProductPrec :: Int -> MonomorphicProduct -> Builder+showbMonomorphicProductPrec = showbPrec++showbPolymorphicProductPrec :: (Show a, Show b, Show c, Show d)+ => Int -> PolymorphicProduct a b c d -> Builder+showbPolymorphicProductPrec = showbPrec++showbMonomorphicRecordPrec :: Int -> MonomorphicRecord -> Builder+showbMonomorphicRecordPrec = showbPrec++showbPolymorphicRecordPrec :: (Show a, Show b, Show c, Show d)+ => Int -> PolymorphicRecord a b c d -> Builder+showbPolymorphicRecordPrec = showbPrec++showbMonomorphicInfixPrec :: Int -> MonomorphicInfix -> Builder+showbMonomorphicInfixPrec = showbPrec++showbPolymorphicInfixPrec :: (Show a, Show b, Show c)+ => Int -> PolymorphicInfix a b c -> Builder+showbPolymorphicInfixPrec = showbPrec++showbMonomorphicForallPrec :: Int -> MonomorphicForall -> Builder+showbMonomorphicForallPrec = showbPrec++showbPolymorphicForallPrec :: (Show a, Show b) => Int -> PolymorphicForall a b -> Builder+showbPolymorphicForallPrec = showbPrec++showbAllAtOncePrec :: (Show a, Show b, Show c, Show d)+ => Int -> AllAtOnce a b c d -> Builder+showbAllAtOncePrec = showbPrec++showbNormalGADTPrec :: Int -> NormalGADT -> Builder+showbNormalGADTPrec = showbPrec++showbExistentialGADTPrec :: (Show a, Show b, Show c) => Int -> ExistentialGADT a b c -> Builder+showbExistentialGADTPrec = showbPrec++showbPrimADTPrec# :: Show a => Int -> PrimADT# a -> Builder+showbPrimADTPrec# = showbPrec++showbLeftAssocTreePrec :: Show a => Int -> LeftAssocTree a -> Builder+showbLeftAssocTreePrec = showbPrec++showbRightAssocTreePrec :: Show a => Int -> RightAssocTree a -> Builder+showbRightAssocTreePrec = showbPrec++showbQuestionMarkPrec :: (Show a, Show b) => Int -> a :?: b -> Builder+showbQuestionMarkPrec = showbPrec++-- TODO: Uncomment when these type signatures are generated via Template Haskell+-- +-- showbHigherKindedTypeParamsPrec :: Show (f a)+-- => Int -> HigherKindedTypeParams f a -> Builder+-- showbHigherKindedTypeParamsPrec = showbPrec+-- +-- showbRestrictionPrec :: (Read a, Show a) => Int -> Restriction a -> Builder+-- showbRestrictionPrec = showbPrec+-- +-- showbRestrictedContextPrec :: (Read a, Show a) => Int -> RestrictedContext a -> Builder+-- showbRestrictedContextPrec = showbPrec+-- +-- showbFixPrec :: Show (f (Fix f)) => Int -> Fix f -> Builder+-- showbFixPrec = showbPrec++#if MIN_VERSION_template_haskell(2,7,0)+showbASNullary :: (Show c, Show d) => AllShow () () c d -> Builder+showbASNullary = showb++showbASUnaryPrec :: (Show b, Show c, Show d) => Int -> AllShow Int b c d -> Builder+showbASUnaryPrec = showbPrec++showbASProductPrec :: (Show c, Show d) => Int -> AllShow Bool Bool c d -> Builder+showbASProductPrec = showbPrec++showbASRecordPrec :: (Show c, Show d) => Int -> AllShow Char Double c d -> Builder+showbASRecordPrec = showbPrec++showbASInfixPrec :: (Show c, Show d) => Int -> AllShow Float Ordering c d -> Builder+showbASInfixPrec = showbPrec++showbNASShowPrec :: (Show b, Show d) => Int -> NotAllShow Int b Int d -> Builder+showbNASShowPrec = showbPrec++showbOneDataInstancePrec :: (Show a, Show b, Show c, Show d)+ => Int -> OneDataInstance a b c d -> Builder+showbOneDataInstancePrec = showbPrec++showbAssocData1Prec :: Int -> AssocData1 () -> Builder+showbAssocData1Prec = showbPrec++showbAssocData2Prec :: Int -> AssocData2 () Int Int -> Builder+showbAssocData2Prec = showbPrec++-- showbAssocData3Prec :: Int -> AssocData3 () b c -> Builder+-- showbAssocData3Prec = showbPrec++# if __GLASGOW_HASKELL__ >= 708+showbNullaryDataPrec :: Int -> NullaryData -> Builder+showbNullaryDataPrec = showbPrec+# endif++showbGADTFamPrec :: (Show a, Show b, Show c) => Int -> GADTFam a b c -> Builder+showbGADTFamPrec = showbPrec+#endif++-------------------------------------------------------------------------------++$(deriveShow ''Nullary)+instance Arbitrary Nullary where+ arbitrary = pure Nullary++$(deriveShow ''PhantomNullary)+instance Arbitrary (PhantomNullary a) where+ arbitrary = pure PhantomNullary++$(deriveShow ''MonomorphicUnary)+deriving instance Arbitrary MonomorphicUnary++$(deriveShow ''PolymorphicUnary)+deriving instance Arbitrary b => Arbitrary (PolymorphicUnary a b)++$(deriveShow ''MonomorphicProduct)+instance Arbitrary MonomorphicProduct where+ arbitrary = MonomorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary++$(deriveShow ''PolymorphicProduct)+instance (Arbitrary a, Arbitrary b, Arbitrary d) => Arbitrary (PolymorphicProduct a b c d) where+ arbitrary = PolymorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary++$(deriveShow ''MonomorphicRecord)+instance Arbitrary MonomorphicRecord where+ arbitrary = MonomorphicRecord <$> arbitrary <*> arbitrary <*> arbitrary++$(deriveShow ''PolymorphicRecord)+instance (Arbitrary a, Arbitrary b, Arbitrary d) => Arbitrary (PolymorphicRecord a b c d) where+ arbitrary = (:%%%:) <$> arbitrary <*> arbitrary <*> arbitrary++$(deriveShow ''MonomorphicInfix)+instance Arbitrary MonomorphicInfix where+ arbitrary = (:/:) <$> arbitrary <*> arbitrary++$(deriveShow ''PolymorphicInfix)+instance (Arbitrary a, Arbitrary c) => Arbitrary (PolymorphicInfix a b c) where+ arbitrary = PolyInf <$> arbitrary <*> arbitrary++$(deriveShow ''MonomorphicForall)+instance Arbitrary MonomorphicForall where+ arbitrary = MonomorphicForall <$> (arbitrary :: Gen Int)++$(deriveShow ''PolymorphicForall)+instance Arbitrary a => Arbitrary (PolymorphicForall a b) where+ arbitrary = PolymorphicForall <$> arbitrary <*> (arbitrary :: Gen Int)++$(deriveShow ''AllAtOnce)+instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (AllAtOnce a b c d) where+ arbitrary = oneof [ pure AAONullary+ , AAOUnary <$> arbitrary+ , AAOProduct <$> arbitrary <*> arbitrary <*> arbitrary+ , AAORecord <$> arbitrary <*> arbitrary <*> arbitrary+ , (:/\:) <$> arbitrary <*> arbitrary+ , AAOForall <$> arbitrary <*> arbitrary <*> (arbitrary :: Gen Int)+ ]++$(deriveShow ''NormalGADT)+instance Arbitrary NormalGADT where+ arbitrary = oneof [ (:.) <$> arbitrary <*> arbitrary+ , (:..) <$> arbitrary <*> arbitrary+ ]++$(deriveShow ''ExistentialGADT)+instance __OVERLAPPING__ Arbitrary (ExistentialGADT Char b c) where+ arbitrary = pure GADTCon1+instance __OVERLAPPING__ Arbitrary (ExistentialGADT Double Double c) where+ arbitrary = GADTCon2 <$> arbitrary+instance __OVERLAPPING__ Arbitrary (ExistentialGADT Int String c) where+ arbitrary = GADTCon3 <$> arbitrary+instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (ExistentialGADT a b c) where+ arbitrary = GADTCon4 <$> arbitrary+instance __OVERLAPPING__ Arbitrary b => Arbitrary (ExistentialGADT b b c) where+ arbitrary = GADTCon5 <$> arbitrary++$(deriveShow ''PrimADT#)+instance Arbitrary (PrimADT# a) where+ arbitrary = do+ i@(I# i#) <- arbitrary+ F# f# <- arbitrary+ D# d# <- arbitrary+ C# c# <- arbitrary+ W# w# <- arbitrary+ oneof $ map pure [ PrimNormal# i# f# d# c# w#+ , PrimRecord# i# f# d# c# w#+ , i# `PrimInfixIntegral#` w#+ , f# `PrimInfixFloating#` d#+ , c# `PrimInfixChar#` c#+ , PrimForall# i i# f# d# c# w#+ ]++$(deriveShow ''LeftAssocTree)+instance Arbitrary a => Arbitrary (LeftAssocTree a) where+ arbitrary = oneof [ LeftAssocLeaf <$> arbitrary+ , (:<:) <$> (LeftAssocLeaf <$> arbitrary)+ <*> (LeftAssocLeaf <$> arbitrary)+ ]++$(deriveShow ''RightAssocTree)+instance Arbitrary a => Arbitrary (RightAssocTree a) where+ arbitrary = oneof [ RightAssocLeaf <$> arbitrary+ , (:>:) <$> (RightAssocLeaf <$> arbitrary)+ <*> (RightAssocLeaf <$> arbitrary)+ ]++$(deriveShow ''(:?:))+instance (Arbitrary a, Arbitrary b) => Arbitrary (a :?: b) where+ arbitrary = (:?:) <$> arbitrary <*> arbitrary++instance Show (f a) => Show (HigherKindedTypeParams f a) where+ showbPrec = $(mkShowbPrec ''HigherKindedTypeParams)+deriving instance Arbitrary (f a) => Arbitrary (HigherKindedTypeParams f a)++instance (Read a, Show a) => Show (Restriction a) where+ showbPrec = $(mkShowbPrec ''Restriction)+deriving instance Arbitrary a => Arbitrary (Restriction a)++instance (Read a, Show a) => Show (RestrictedContext a) where+ showbPrec = $(mkShowbPrec ''RestrictedContext)+deriving instance Arbitrary a => Arbitrary (RestrictedContext a)++instance Show (f (Fix f)) => Show (Fix f) where+ showbPrec = $(mkShowbPrec ''Fix)+deriving instance Arbitrary (f (Fix f)) => Arbitrary (Fix f)++#if MIN_VERSION_template_haskell(2,7,0)+$(deriveShow ''AllShow)+instance Arbitrary (AllShow () () c d) where+ arbitrary = pure ASNullary+deriving instance Arbitrary (AllShow Int b c d)+instance Arbitrary (AllShow Bool Bool c d) where+ arbitrary = ASProduct <$> arbitrary <*> arbitrary+instance Arbitrary c => Arbitrary (AllShow Char Double c d) where+ arbitrary = ASRecord <$> arbitrary <*> arbitrary <*> arbitrary+instance Arbitrary (AllShow Float Ordering c d) where+ arbitrary = ASInfix <$> arbitrary <*> arbitrary++$(deriveShow 'NASShow1)+instance Arbitrary b => Arbitrary (NotAllShow Int b Int d) where+ arbitrary = oneof [NASShow1 <$> arbitrary <*> arbitrary, NASShow2 <$> arbitrary]++$(deriveShow ''OneDataInstance)+instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (OneDataInstance a b c d) where+ arbitrary = oneof [ pure ODINullary+ , ODIUnary <$> arbitrary+ , ODIProduct <$> arbitrary <*> arbitrary+ , ODIRecord <$> arbitrary <*> arbitrary <*> arbitrary+ , ODIInfix <$> arbitrary <*> arbitrary+ ]++$(deriveShow ''AssocData1)+deriving instance Arbitrary (AssocData1 ())++$(deriveShow 'AssocCon2)+deriving instance Arbitrary (AssocData2 () Int Int)++#if __GLASGOW_HASKELL__ >= 708+$(deriveShow 'NullaryCon)+deriving instance Arbitrary NullaryData+#endif++$(deriveShow 'GADTFamCon1)+instance __OVERLAPPING__ Arbitrary (GADTFam Char b c) where+ arbitrary = pure GADTFamCon1+instance __OVERLAPPING__ Arbitrary (GADTFam Double Double c) where+ arbitrary = GADTFamCon2 <$> arbitrary+instance __OVERLAPPING__ Arbitrary (GADTFam Int String c) where+ arbitrary = GADTFamCon3 <$> arbitrary+instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (GADTFam a b c) where+ arbitrary = GADTFamCon4 <$> arbitrary+instance __OVERLAPPING__ Arbitrary b => Arbitrary (GADTFam b b c) where+ arbitrary = GADTFamCon5 <$> arbitrary+#endif
+ tests/Instances/Foreign/C/Types.hs view
@@ -0,0 +1,142 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,5,0)+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Foreign.C.Types+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Foreign.C.Types" module.+-}+module Instances.Foreign.C.Types () where++import Foreign.C.Types+import Test.QuickCheck (Arbitrary(..))++#if !(MIN_VERSION_base(4,5,0))+import Data.Int+# if MIN_VERSION_base(4,4,0)+import Data.Word+# endif++import Test.QuickCheck (Gen, arbitrarySizedBoundedIntegral, arbitrarySizedFractional)+import Unsafe.Coerce (unsafeCoerce)++# include "HsBaseConfig.h"+#endif++#if MIN_VERSION_base(4,5,0)+deriving instance Arbitrary CChar+deriving instance Arbitrary CSChar+deriving instance Arbitrary CUChar+deriving instance Arbitrary CShort+deriving instance Arbitrary CUShort+deriving instance Arbitrary CInt+deriving instance Arbitrary CUInt+deriving instance Arbitrary CLong+deriving instance Arbitrary CULong+deriving instance Arbitrary CLLong+deriving instance Arbitrary CULLong+deriving instance Arbitrary CFloat+deriving instance Arbitrary CDouble+deriving instance Arbitrary CPtrdiff+deriving instance Arbitrary CSize+deriving instance Arbitrary CWchar+deriving instance Arbitrary CSigAtomic+deriving instance Arbitrary CClock+deriving instance Arbitrary CTime+# if MIN_VERSION_base(4,4,0)+deriving instance Arbitrary CUSeconds+deriving instance Arbitrary CSUSeconds+# endif+deriving instance Arbitrary CIntPtr+deriving instance Arbitrary CUIntPtr+deriving instance Arbitrary CIntMax+deriving instance Arbitrary CUIntMax+#else+instance Arbitrary CChar where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CSChar where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CUChar where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CShort where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CUShort where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CInt where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CUInt where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CLong where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CULong where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CLLong where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CULLong where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CFloat where+ arbitrary = arbitrarySizedFractional++instance Arbitrary CDouble where+ arbitrary = arbitrarySizedFractional++instance Arbitrary CPtrdiff where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CSize where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CWchar where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CSigAtomic where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CClock where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_CLOCK_T)++instance Arbitrary CTime where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_TIME_T)++# if MIN_VERSION_base(4,4,0)+instance Arbitrary CUSeconds where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_USECONDS_T)++instance Arbitrary CSUSeconds where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_SUSECONDS_T)+# endif++instance Arbitrary CIntPtr where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CUIntPtr where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CIntMax where+ arbitrary = arbitrarySizedBoundedIntegral++instance Arbitrary CUIntMax where+ arbitrary = arbitrarySizedBoundedIntegral+#endif
+ tests/Instances/Foreign/Ptr.hs view
@@ -0,0 +1,34 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Foreign.Ptr+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for pointer data types.+-}+module Instances.Foreign.Ptr () where++import Foreign.Ptr (FunPtr, IntPtr, Ptr, WordPtr,+ castPtrToFunPtr, nullPtr, plusPtr,+ ptrToIntPtr, ptrToWordPtr)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary (Ptr a) where+ arbitrary = plusPtr nullPtr <$> arbitrary++instance Arbitrary (FunPtr a) where+ arbitrary = castPtrToFunPtr <$> arbitrary++instance Arbitrary IntPtr where+ arbitrary = ptrToIntPtr <$> arbitrary++instance Arbitrary WordPtr where+ arbitrary = ptrToWordPtr <$> arbitrary
+ tests/Instances/FromStringTextShow.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.FromStringTextShow+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances 'FromStringShow' and 'FromTextShow'+-}+module Instances.FromStringTextShow () where++import Test.QuickCheck (Arbitrary)+import Text.Show.Text (FromStringShow(..), FromTextShow(..))++deriving instance Arbitrary a => Arbitrary (FromStringShow a)+deriving instance Arbitrary a => Arbitrary (FromTextShow a)
+ tests/Instances/GHC/Conc/Windows.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.Conc.Windows+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'ConsoleEvent'.+-}+module Instances.GHC.Conc.Windows () where++#if !defined(__GHCJS__) && defined(mingw32_HOST_OS)+import GHC.Conc.Windows (ConsoleEvent(..))+import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum)++deriving instance Bounded ConsoleEvent+instance Arbitrary ConsoleEvent where+ arbitrary = arbitraryBoundedEnum+#endif
+ tests/Instances/GHC/Event.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.Event+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "GHC.Event" module.+-}+module Instances.GHC.Event () where++#if !defined(__GHCJS__) && !defined(mingw32_HOST_OS) && MIN_VERSION_base(4,4,0)+import GHC.Event (Event, evtRead, evtWrite)++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), oneof)++instance Arbitrary Event where+ arbitrary = oneof $ map pure [evtRead, evtWrite]++-- TODO: instance Arbitrary FdKey+#endif
+ tests/Instances/GHC/Fingerprint.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.Fingerprint+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'Fingerprint'.+-}+module Instances.GHC.Fingerprint () where++#if MIN_VERSION_base(4,4,0)+import GHC.Fingerprint.Type (Fingerprint(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary Fingerprint where+ arbitrary = Fingerprint <$> arbitrary <*> arbitrary+#endif
+ tests/Instances/GHC/Generics.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeOperators #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.Generics+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "GHC.Generics" module.+-}+module Instances.GHC.Generics () where++#if __GLASGOW_HASKELL__ >= 702+import GHC.Generics (U1(..), Par1(..), Rec1(..), K1(..),+ M1(..), (:+:)(..), (:*:)(..), (:.:)(..),+ Fixity(..), Associativity(..), Arity(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)++instance Arbitrary (U1 p) where+ arbitrary = pure U1++deriving instance Arbitrary p => Arbitrary (Par1 p)+deriving instance Arbitrary (f p) => Arbitrary (Rec1 f p)+deriving instance Arbitrary c => Arbitrary (K1 i c p)+deriving instance Arbitrary (f p) => Arbitrary (M1 i c f p)++instance (Arbitrary (f p), Arbitrary (g p)) => Arbitrary ((f :+: g) p) where+ arbitrary = oneof [L1 <$> arbitrary, R1 <$> arbitrary]++instance (Arbitrary (f p), Arbitrary (g p)) => Arbitrary ((f :*: g) p) where+ arbitrary = (:*:) <$> arbitrary <*> arbitrary++deriving instance Arbitrary (f (g p)) => Arbitrary ((f :.: g) p)++instance Arbitrary Fixity where+ arbitrary = oneof [pure Prefix, Infix <$> arbitrary <*> arbitrary]++deriving instance Bounded Associativity+deriving instance Enum Associativity+instance Arbitrary Associativity where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary Arity where+ arbitrary = oneof [pure NoArity, Arity <$> arbitrary]+#endif
+ tests/Instances/GHC/RTS/Flags.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.RTS.Flags+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "GHC.RTS.Flags" module.+-}+module Instances.GHC.RTS.Flags () where++#if MIN_VERSION_base(4,8,0)+import GHC.RTS.Flags+import Test.QuickCheck (Arbitrary(..))++instance Arbitrary ConcFlags where+ arbitrary = ConcFlags <$> arbitrary <*> arbitrary++instance Arbitrary MiscFlags where+ arbitrary = MiscFlags <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary++instance Arbitrary DebugFlags where+ arbitrary = DebugFlags <$> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary++instance Arbitrary TickyFlags where+ arbitrary = TickyFlags <$> arbitrary <*> arbitrary+#endif
+ tests/Instances/GHC/StaticPtr.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.StaticPtr+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'StaticPtrInfo'.+-}+module Instances.GHC.StaticPtr () where++#if MIN_VERSION_base(4,8,0)+import GHC.StaticPtr (StaticPtrInfo(..))+import Test.QuickCheck (Arbitrary(..))++instance Arbitrary StaticPtrInfo where+ arbitrary = StaticPtrInfo <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+#endif
+ tests/Instances/GHC/Stats.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.Stats+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'GCStats'.+-}+module Instances.GHC.Stats () where++#if MIN_VERSION_base(4,5,0)+import GHC.Stats (GCStats(..))++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++instance Arbitrary GCStats where+ arbitrary = GCStats <$> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary+#endif
+ tests/Instances/GHC/TypeLits.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,6,0) && !(MIN_VERSION_base(4,7,0))+{-# LANGUAGE PolyKinds #-}+#endif++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.GHC.TypeLits+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "GHC.TypeLits" module.+-}+module Instances.GHC.TypeLits () where++#if MIN_VERSION_base(4,6,0)+import GHC.TypeLits++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..))++# if MIN_VERSION_base(4,7,0)+import Test.QuickCheck (getNonNegative)+# endif+#endif++#if MIN_VERSION_base(4,7,0)+instance Arbitrary SomeNat where+ arbitrary = do+ nat <- getNonNegative <$> arbitrary+ case someNatVal nat of+ Just sn -> pure sn+ Nothing -> fail "Negative natural number" -- Should never happen++instance Arbitrary SomeSymbol where+ arbitrary = someSymbolVal <$> arbitrary+#elif MIN_VERSION_base(4,6,0)+instance SingI a => Arbitrary (Sing a) where+ arbitrary = pure sing++instance SingI n => Arbitrary (IsZero n) where+ arbitrary = pure $ isZero sing++instance SingI n => Arbitrary (IsEven n) where+ arbitrary = pure $ isEven sing+#endif
+ tests/Instances/Generic.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Generic+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'ConType'.+-}+module Instances.Generic () where++#if __GLASGOW_HASKELL__ >= 702+import Instances.Data.Text ()++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), oneof)++import Text.Show.Text.Generic (ConType(..))++instance Arbitrary ConType where+ arbitrary = oneof [pure Rec, pure Tup, pure Pref, Inf <$> arbitrary]+#endif
+ tests/Instances/Numeric/Natural.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Numeric.Natural+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance 'Natural' (if one isn't already defined).+-}+module Instances.Numeric.Natural () where++#if !(MIN_VERSION_QuickCheck(2,8,0)) || !(MIN_VERSION_base(4,8,0))+import Numeric.Natural (Natural)+import Test.QuickCheck (Arbitrary(..), arbitrarySizedNatural, shrinkIntegral)++instance Arbitrary Natural where+ arbitrary = arbitrarySizedNatural+ shrink = shrinkIntegral+#endif
+ tests/Instances/System/Exit.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.System.Exit+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instance for 'ExitCode'.+-}+module Instances.System.Exit () where++import Prelude ()+import Prelude.Compat++import System.Exit (ExitCode(..))++import Test.QuickCheck (Arbitrary(..), oneof)++instance Arbitrary ExitCode where+ arbitrary = oneof [pure ExitSuccess, ExitFailure <$> arbitrary]
+ tests/Instances/System/IO.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.System.IO+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "System.IO" module.+-}+module Instances.System.IO () where++#if MIN_VERSION_base(4,4,0)+import GHC.IO.Encoding.Failure (CodingFailureMode(..))+import GHC.IO.Encoding.Types (CodingProgress(..))+#endif++import GHC.IO.Handle (HandlePosn(..))++import Prelude ()+import Prelude.Compat++import System.IO (BufferMode(..), IOMode(..), Newline(..), NewlineMode(..),+ SeekMode(..), Handle, stdin, stdout, stderr)++import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)++instance Arbitrary Handle where+ arbitrary = oneof $ map pure [stdin, stdout, stderr]++instance Arbitrary HandlePosn where+ arbitrary = HandlePosn <$> arbitrary <*> arbitrary++deriving instance Bounded IOMode+instance Arbitrary IOMode where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary BufferMode where+ arbitrary = oneof [ pure NoBuffering+ , pure LineBuffering+ , BlockBuffering <$> arbitrary+ ]++deriving instance Bounded SeekMode+instance Arbitrary SeekMode where+ arbitrary = arbitraryBoundedEnum++#if MIN_VERSION_base(4,4,0)+deriving instance Bounded CodingProgress+deriving instance Enum CodingProgress+instance Arbitrary CodingProgress where+ arbitrary = arbitraryBoundedEnum++deriving instance Bounded CodingFailureMode+deriving instance Enum CodingFailureMode+instance Arbitrary CodingFailureMode where+ arbitrary = arbitraryBoundedEnum+#endif++deriving instance Bounded Newline+deriving instance Enum Newline+instance Arbitrary Newline where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary NewlineMode where+ arbitrary = NewlineMode <$> arbitrary <*> arbitrary
+ tests/Instances/System/Posix/Types.hs view
@@ -0,0 +1,126 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-}++{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.System.Posix.Types+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "System.Posix.Types" module.+-}+module Instances.System.Posix.Types () where++import Instances.Foreign.C.Types ()+import System.Posix.Types+import Test.QuickCheck (Arbitrary(..))++#if !(MIN_VERSION_base(4,5,0))+import Data.Word+import Test.QuickCheck (Gen, arbitrarySizedBoundedIntegral)+import Unsafe.Coerce (unsafeCoerce)+#endif++#include "HsBaseConfig.h"++#if MIN_VERSION_base(4,5,0)+# if defined(HTYPE_DEV_T)+deriving instance Arbitrary CDev+# endif+# if defined(HTYPE_INO_T)+deriving instance Arbitrary CIno+# endif+# if defined(HTYPE_MODE_T)+deriving instance Arbitrary CMode+# endif+# if defined(HTYPE_OFF_T)+deriving instance Arbitrary COff+# endif+# if defined(HTYPE_PID_T)+deriving instance Arbitrary CPid+# endif+# if defined(HTYPE_SSIZE_T)+deriving instance Arbitrary CSsize+# endif+# if defined(HTYPE_GID_T)+deriving instance Arbitrary CGid+# endif+# if defined(HTYPE_NLINK_T)+deriving instance Arbitrary CNlink+# endif+# if defined(HTYPE_UID_T)+deriving instance Arbitrary CUid+# endif+# if defined(HTYPE_CC_T)+deriving instance Arbitrary CCc+# endif+# if defined(HTYPE_SPEED_T)+deriving instance Arbitrary CSpeed+# endif+# if defined(HTYPE_TCFLAG_T)+deriving instance Arbitrary CTcflag+# endif+# if defined(HTYPE_RLIM_T)+deriving instance Arbitrary CRLim+# endif+#else+# if defined(HTYPE_DEV_T)+instance Arbitrary CDev where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_DEV_T)+# endif+# if defined(HTYPE_INO_T)+instance Arbitrary CIno where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_MODE_T)+instance Arbitrary CMode where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_OFF_T)+instance Arbitrary COff where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_PID_T)+instance Arbitrary CPid where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_SSIZE_T)+instance Arbitrary CSsize where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_GID_T)+instance Arbitrary CGid where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_NLINK_T)+instance Arbitrary CNlink where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_UID_T)+instance Arbitrary CUid where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_CC_T)+instance Arbitrary CCc where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_CC_T)+# endif+# if defined(HTYPE_SPEED_T)+instance Arbitrary CSpeed where+ arbitrary = unsafeCoerce (arbitrary :: Gen HTYPE_SPEED_T)+# endif+# if defined(HTYPE_TCFLAG_T)+instance Arbitrary CTcflag where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+# if defined(HTYPE_RLIM_T)+instance Arbitrary CRLim where+ arbitrary = arbitrarySizedBoundedIntegral+# endif+#endif++deriving instance Arbitrary Fd
+ tests/Instances/Text/Read.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+Module: Instances.Text.Read+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++'Arbitrary' instances for data types in the "Text.Read" module.+-}+module Instances.Text.Read () where++import Prelude ()+import Prelude.Compat++import Test.QuickCheck (Arbitrary(..), oneof)++import Text.Read (Lexeme(..))++#if MIN_VERSION_base(4,7,0)+import Data.Fixed (Fixed, E12)+import Numeric (showEFloat, showFFloat, showGFloat, showHex, showOct)+import Test.QuickCheck (Gen, getNonNegative)+import Text.Read.Lex (Number)+#endif++instance Arbitrary Lexeme where+ arbitrary = oneof [ Char <$> arbitrary+ , String <$> arbitrary+ , Punc <$> arbitrary+ , Ident <$> arbitrary+ , Symbol <$> arbitrary+#if MIN_VERSION_base(4,7,0)+ , Number <$> arbitrary+#elif !(MIN_VERSION_base(4,6,0))+ , Int <$> arbitrary+ , Rat <$> arbitrary+#endif+ , pure EOF+ ]+ +#if MIN_VERSION_base(4,7,0)+instance Arbitrary Number where+ arbitrary = do+ str <- oneof [ show <$> (nonneg :: Gen Double)+ , fmap (\d -> showEFloat Nothing d "") (nonneg :: Gen Double)+ , fmap (\d -> showFFloat Nothing d "") (nonneg :: Gen Double)+ , fmap (\d -> showGFloat Nothing d "") (nonneg :: Gen Double)+ , show <$> (nonneg :: Gen Float)+ , show <$> (nonneg :: Gen Int)+ , fmap (\i -> "0x" ++ showHex i "") (nonneg :: Gen Int)+ , fmap (\i -> "0o" ++ showOct i "") (nonneg :: Gen Int)+ , show <$> (nonneg :: Gen Integer)+ , show <$> (nonneg :: Gen Word)+ , show <$> (nonneg :: Gen (Fixed E12))+ ]+ let Number num = read str+ pure num+ where+ nonneg :: (Arbitrary a, Num a, Ord a) => Gen a+ nonneg = getNonNegative <$> arbitrary+#endif
tests/Instances/Utils.hs view
@@ -1,16 +1,16 @@-{-| -Module: Properties.Instances -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -A collection of utility functions. --} -module Instances.Utils ((<@>)) where - -infixl 4 <@> --- | A useful way to escape a 'Functor' context. -(<@>) :: Functor f => f (a -> b) -> a -> f b +{-|+Module: Properties.Instances+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++A collection of utility functions.+-}+module Instances.Utils ((<@>)) where++infixl 4 <@>+-- | A useful way to escape a 'Functor' context.+(<@>) :: Functor f => f (a -> b) -> a -> f b f <@> x = fmap ($ x) f
− tests/Properties.hs
@@ -1,31 +0,0 @@-{-| -Module: Properties -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ tests for @text-show@. --} -module Main (main) where - -import Properties.BaseAndFriends (baseAndFriendsTests) -import Properties.Builder (builderTests) -import Properties.Derived (derivedTests) -import Properties.MkShow (mkShowTests) - -import Test.Tasty (TestTree, defaultMain, testGroup) - -main :: IO () -main = defaultMain testTree - -allTests :: [TestTree] -allTests = concat [ baseAndFriendsTests - , builderTests - , derivedTests - , mkShowTests - ] - -testTree :: TestTree -testTree = testGroup "QuickCheck properties" allTests
− tests/Properties/BaseAndFriends.hs
@@ -1,623 +0,0 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE TypeOperators #-} -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) -{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-} -#endif -{-| -Module: Properties.BaseAndFriends -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ properties for data types located in @base@ and other -common libraries. --} -module Properties.BaseAndFriends (baseAndFriendsTests) where - -import Control.Applicative (Const, ZipList, liftA2) -#if !(MIN_VERSION_base(4,8,0)) -import Control.Applicative (pure) -#endif -import Control.Concurrent (myThreadId) -import Control.Exception -import Control.Monad.ST - -#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0) -import Data.Array (Array) -import Data.Array.Unboxed (UArray) -#endif -import Data.Array (elems) -import qualified Data.ByteString as BS (ByteString) -import qualified Data.ByteString.Lazy as BL (ByteString) -import Data.ByteString.Short (ShortByteString) -import Data.Char (GeneralCategory, intToDigit) -import Data.Complex (Complex) -import qualified Data.Data as D (Fixity) -import Data.Data (Constr, ConstrRep, DataRep, DataType) -import Data.Dynamic (Dynamic) -import Data.Fixed (Fixed, E0, E1, E2, E3, E6, E9, E12, showFixed) -import Data.Functor.Identity (Identity) -import Data.Int (Int8, Int16, Int32, Int64) -import Data.Monoid (All(..), Any(..), Dual(..), First(..), - Last(..), Product(..), Sum(..)) -#if MIN_VERSION_base(4,8,0) -import Data.Monoid (Alt(..)) -#endif -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) -import qualified Data.OldTypeable as OldT (TyCon, TypeRep) -#endif -#if MIN_VERSION_base(4,6,0) -import Data.Ord (Down(..)) -#endif -import Data.Proxy (Proxy) -import Data.Ratio (Ratio) -import qualified Data.Text as TS -import qualified Data.Text as TL -#if MIN_VERSION_base(4,7,0) -import Data.Type.Coercion (Coercion) -import Data.Type.Equality ((:~:)) -#endif -import qualified Data.Typeable as NewT (TyCon, TypeRep) -import Data.Word (Word8, Word16, Word32, Word64) -#if !(MIN_VERSION_base(4,8,0)) -import Data.Word (Word) -#endif -import Data.Version (Version, showVersion) - --- import qualified Debug.Trace as S (traceShow) - -import Foreign.C.Types -import Foreign.ForeignPtr (newForeignPtr_) -import Foreign.Ptr (FunPtr, IntPtr, Ptr, WordPtr) - -import GHC.Conc (BlockReason, ThreadStatus) -#if !(defined(__GHCJS__)) -# if defined(mingw32_HOST_OS) -import GHC.Conc.Windows (ConsoleEvent) -# else -import GHC.Event (Event) -# endif -#endif -import GHC.Fingerprint.Type (Fingerprint) -import qualified GHC.Generics as G (Fixity) -import GHC.Generics (U1, Par1, Rec1, K1, M1, (:+:), (:*:), (:.:), - Associativity, Arity) -import GHC.IO.Encoding.Failure (CodingFailureMode) -import GHC.IO.Encoding.Types (CodingProgress) -#if MIN_VERSION_base(4,8,0) -import GHC.RTS.Flags -import GHC.StaticPtr (StaticPtrInfo) -#endif -import GHC.Stats (GCStats) -import GHC.Show (asciiTab) -#if MIN_VERSION_base(4,7,0) -import GHC.TypeLits (SomeNat, SomeSymbol) -#endif - -import Instances.BaseAndFriends () - -import Numeric (showIntAtBase, showEFloat, showFFloat, showGFloat) -#if MIN_VERSION_base(4,7,0) -import Numeric (showFFloatAlt, showGFloatAlt) -#endif -import Numeric.Natural (Natural) - -import Prelude hiding (Show) - -import Properties.Utils - -import System.Exit (ExitCode) --- import qualified System.IO as S (print) -import System.IO (BufferMode, IOMode, HandlePosn, Newline, - NewlineMode, SeekMode, Handle, mkTextEncoding) --- import System.IO.Silently (capture_, hCapture_) -import System.Posix.Types - -import Test.QuickCheck.Instances () -import Test.Tasty (TestTree, testGroup) -import Test.Tasty.HUnit ((@=?), testCase) -import Test.Tasty.QuickCheck (Gen, Property, arbitrary, generate, - oneof, suchThat, testProperty) - -import Text.Read.Lex (Lexeme) -#if MIN_VERSION_base(4,7,0) -import Text.Read.Lex (Number) -#endif -import Text.Show (showListWith) -import Text.Show.Functions () --- import qualified Text.Show.Text as T (print) -import Text.Show.Text hiding (Show, print) -import Text.Show.Text.Data.Char (asciiTabB) -import Text.Show.Text.Data.Fixed (showbFixed) -import Text.Show.Text.Data.Floating (showbEFloat, showbFFloat, showbGFloat) -#if MIN_VERSION_base(4,7,0) -import Text.Show.Text.Data.Floating (showbFFloatAlt, showbGFloatAlt) -#endif -import Text.Show.Text.Data.Integral (showbIntAtBase) -import Text.Show.Text.Data.List (showbListWith) -import Text.Show.Text.Data.Version (showbVersionConcrete) --- import qualified Text.Show.Text.Debug.Trace as T (traceShow) -import Text.Show.Text.Functions () -import Text.Show.Text.Generic (ConType) - -#include "HsBaseConfig.h" - --- -- | Verifies the 'print' functions for 'String' and 'TS.Text' @Show@ display --- -- the same output. --- prop_print :: String -> Property --- prop_print str = ioProperty $ do --- sRes <- capture_ $ S.print str *> hFlush stdout --- tRes <- capture_ $ T.print str *> hFlush stdout --- pure $ sRes == tRes - --- | Verifies 'showFixed' and 'showbFixed' generate the same output. -prop_showFixed :: Bool -> Fixed E12 -> Bool -prop_showFixed b f = fromString (showFixed b f) == showbFixed b f - --- | Verifies the 'Show' instance for 'ForeignPtr' is accurate. -prop_showForeignPtr :: Int -> Ptr Int -> Property -prop_showForeignPtr p ptr = ioProperty $ do - fptr <- newForeignPtr_ ptr - pure $ prop_matchesShow p fptr - --- | Verifies 'showIntAtBase' and 'showbIntAtBase' generate the same output. -#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0) -prop_showIntAtBase :: Gen Bool -prop_showIntAtBase = do - base <- arbitrary `suchThat` (liftA2 (&&) (> 1) (<= 16)) - i <- arbitrary `suchThat` (>= 0) :: Gen Int - pure $ fromString (showIntAtBase base intToDigit i "") == showbIntAtBase base intToDigit i -#endif - --- | Verifies 'showListWith' and 'showbListWith' generate the same output. -prop_showListWith :: [Char] -> Bool -prop_showListWith str = fromString (showListWith shows str "") == showbListWith showb str - --- | Verifies the 'Show' instance for 'TextEncoding' is accurate. -prop_showTextEncoding :: Int -> Property -prop_showTextEncoding p = ioProperty $ do - -- Based on this description: - -- http://hackage.haskell.org/package/base-4.7.0.2/docs/System-IO.html#v:mkTextEncoding - utf <- generate . oneof $ map pure [ "UTF-8" - , "UTF-16", "UTF-16BE", "UTF-16LE" - , "UTF-32", "UTF-32BE", "UTF-32LE" - ] - tenc <- mkTextEncoding utf - pure $ prop_matchesShow p tenc - --- | Verifies the 'Show' instance for 'ThreadId' is accurate. -prop_showThreadId :: Int -> Property -prop_showThreadId p = ioProperty $ do - tid <- myThreadId - pure $ prop_matchesShow p tid - --- | Verifies @showXFloat@ and @showbXFloat@ generate the same output (where @X@ --- is one of E, F, or G). -prop_showXFloat :: (Maybe Int -> Double -> ShowS) -> (Maybe Int -> Double -> Builder) -> Double -> Gen Bool -prop_showXFloat f1 f2 val = do - digs <- arbitrary `suchThat` (<= 10) - pure $ fromString (f1 (Just digs) val "") == f2 (Just digs) val - --- | Verifies 'showVersion' and 'showbVersion' generate the same output. -prop_showVersion :: Version -> Bool -prop_showVersion v = fromString (showVersion v) == showbVersionConcrete v - -#if MIN_VERSION_base(4,8,0) --- | Verifies that the 'Show' instance for 'RTSFlags' is accurate. -prop_showRTSFlags :: Int -> Property -prop_showRTSFlags p = ioProperty $ do - rtsflags <- getRTSFlags - pure $ prop_matchesShow p rtsflags - --- | Verifies that the 'Show' instance for 'GCFlags' is accurate. -prop_showGCFlags :: Int -> Property -prop_showGCFlags p = ioProperty $ do - gcflags <- getGCFlags - pure $ prop_matchesShow p gcflags - --- | Verifies that the 'Show' instance for 'CCFlags' is accurate. -prop_showCCFlags :: Int -> Property -prop_showCCFlags p = ioProperty $ do - ccflags <- getCCFlags - pure $ prop_matchesShow p ccflags - --- | Verifies that the 'Show' instance for 'ProfFlags' is accurate. -prop_showProfFlags :: Int -> Property -prop_showProfFlags p = ioProperty $ do - profflags <- getProfFlags - pure $ prop_matchesShow p profflags - --- | Verifies that the 'Show' instance for 'TraceFlags' is accurate. -prop_showTraceFlags :: Int -> Property -prop_showTraceFlags p = ioProperty $ do - traceflags <- getTraceFlags - pure $ prop_matchesShow p traceflags -#endif - --- -- | Verifies the 'traceShow' functions for 'String' and 'TS.Text' @Show@ display --- -- the same output. --- prop_traceShow :: String -> Property --- prop_traceShow str = ioProperty $ do --- let handles = [stdout, stderr] --- sRes <- hCapture_ handles $ S.traceShow str (pure ()) *> mapM_ hFlush handles --- tRes <- hCapture_ handles $ T.traceShow str (pure ()) *> mapM_ hFlush handles --- pure $ sRes == tRes - -baseAndFriendsTests :: [TestTree] -baseAndFriendsTests = - [ testGroup "Text.Show.Text" - [ testProperty "FromStringShow Int instance" (prop_matchesShow :: Int -> FromStringShow Int -> Bool) - , testProperty "FromStringShow Int: read . show = id" (prop_readShow :: Int -> FromStringShow Int -> Bool) - , testProperty "FromStringShow Int = Int" $ prop_showEq (FromStringShow :: Int -> FromStringShow Int) - , testProperty "FromStringShow [Char] instance" (prop_matchesShow :: Int -> FromStringShow [Char] -> Bool) - , testProperty "FromStringShow [Char]: read . show = id" (prop_readShow :: Int -> FromStringShow [Char] -> Bool) - , testProperty "FromStringShow [Char] = String" $ prop_showEq (FromStringShow :: String -> FromStringShow [Char]) - , testProperty "FromTextShow Int instance" (prop_matchesShow :: Int -> FromTextShow Int -> Bool) - , testProperty "FromTextShow Int: read . show = id" (prop_readShow :: Int -> FromTextShow Int -> Bool) - , testProperty "FromTextShow Int = Int" $ prop_showEq (FromTextShow :: Int -> FromTextShow Int) - , testProperty "FromTextShow [Char] instance" (prop_matchesShow :: Int -> FromTextShow [Char] -> Bool) - , testProperty "FromTextShow [Char]: read . show = id" (prop_readShow :: Int -> FromTextShow [Char] -> Bool) - , testProperty "FromTextShow [Char] = String" $ prop_showEq (FromTextShow :: String -> FromTextShow [Char]) - -- TODO: Figure out why these fail on NixOS --- , testProperty "print behavior" prop_print --- , testProperty "traceShow behavior" prop_traceShow - ] - , testGroup "Text.Show.Text.Control.Applicative" - [ testProperty "Const Int Int instance" (prop_matchesShow :: Int -> Const Int Int -> Bool) - , testProperty "ZipList Int instance" (prop_matchesShow :: Int -> ZipList Int -> Bool) - ] - , testGroup "Text.Show.Text.Control.Concurrent" - [ testProperty "BlockReason instance" (prop_matchesShow :: Int -> BlockReason -> Bool) - , testProperty "ThreadId instance" prop_showThreadId - , testProperty "ThreadStatus instance" (prop_matchesShow :: Int -> ThreadStatus -> Bool) - ] - , testGroup "Text.Show.Text.Control.Exception" - [ testProperty "SomeException instance" (prop_matchesShow :: Int -> SomeException -> Bool) - , testProperty "IOException instance" (prop_matchesShow :: Int -> IOException -> Bool) - , testProperty "ArithException instance" (prop_matchesShow :: Int -> ArithException -> Bool) - , testProperty "ArrayException instance" (prop_matchesShow :: Int -> ArrayException -> Bool) - , testProperty "AssertionFailed instance" (prop_matchesShow :: Int -> AssertionFailed -> Bool) -#if MIN_VERSION_base(4,7,0) - , testProperty "SomeAsyncException instance" (prop_matchesShow :: Int -> SomeAsyncException -> Bool) -#endif - , testProperty "AsyncException instance" (prop_matchesShow :: Int -> AsyncException -> Bool) - , testProperty "NonTermination instance" (prop_matchesShow :: Int -> NonTermination -> Bool) - , testProperty "NestedAtomically instance" (prop_matchesShow :: Int -> NestedAtomically -> Bool) - , testProperty "BlockedIndefinitelyOnMVar instance" (prop_matchesShow :: Int -> BlockedIndefinitelyOnMVar -> Bool) - , testProperty "BlockedIndefinitelyOnSTM instance" (prop_matchesShow :: Int -> BlockedIndefinitelyOnSTM -> Bool) -#if MIN_VERSION_base(4,8,0) - , testProperty "AllocationLimitExceeded instance" (prop_matchesShow :: Int -> AllocationLimitExceeded -> Bool) -#endif - , testProperty "Deadlock instance" (prop_matchesShow :: Int -> Deadlock -> Bool) - , testProperty "NoMethodError instance" (prop_matchesShow :: Int -> NoMethodError -> Bool) - , testProperty "PatternMatchFail instance" (prop_matchesShow :: Int -> PatternMatchFail -> Bool) - , testProperty "RecConError instance" (prop_matchesShow :: Int -> RecConError -> Bool) - , testProperty "RecSelError instance" (prop_matchesShow :: Int -> RecSelError -> Bool) - , testProperty "RecUpdError instance" (prop_matchesShow :: Int -> RecUpdError -> Bool) - , testProperty "ErrorCall instance" (prop_matchesShow :: Int -> ErrorCall -> Bool) - , testProperty "MaskingState instance" (prop_matchesShow :: Int -> MaskingState -> Bool) - ] - , testGroup "Text.Show.Text.Control.Monad.ST" - [ testProperty "ST instance" (prop_matchesShow :: Int -> ST Int Int -> Bool) - ] -#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0) --- TODO: Figure out why this test diverges on Windows - , testGroup "Text.Show.Text.Data.Array" - [ testProperty "Array Int Int instance" (prop_matchesShow :: Int -> Array Int Int -> Bool) - , testProperty "UArray Int Int instance" (prop_matchesShow :: Int -> UArray Int Int -> Bool) - ] -#endif - , testGroup "Text.Show.Text.Data.Bool" - [ testProperty "Bool instance" (prop_matchesShow :: Int -> Bool -> Bool) - ] - , testGroup "Text.Show.Text.Data.ByteString" - [ testProperty "strict ByteString instance" (prop_matchesShow :: Int -> BS.ByteString -> Bool) - , testProperty "lazy ByteString instance" (prop_matchesShow :: Int -> BL.ByteString -> Bool) - , testProperty "ShortByteString instance" (prop_matchesShow :: Int -> ShortByteString -> Bool) - ] - , testGroup "Text.Show.Text.Data.Char" - [ testProperty "Char instance" (prop_matchesShow :: Int -> Char -> Bool) - , testProperty "GeneralCategory instance" (prop_matchesShow :: Int -> GeneralCategory -> Bool) - , testCase "asciiTab = asciiTabB" $ map fromString asciiTab @=? elems (asciiTabB) - ] - , testGroup "Text.Show.Text.Data.Complex" - [ testProperty "Complex Double instance" (prop_matchesShow :: Int -> Complex Double -> Bool) - ] - , testGroup "Text.Show.Text.Data.Data" - [ testProperty "Constr instance" (prop_matchesShow :: Int -> Constr -> Bool) - , testProperty "ConstrRep instance" (prop_matchesShow :: Int -> ConstrRep -> Bool) - , testProperty "DataRep instance" (prop_matchesShow :: Int -> DataRep -> Bool) - , testProperty "DataType instance" (prop_matchesShow :: Int -> DataType -> Bool) - , testProperty "Fixity instance" (prop_matchesShow :: Int -> D.Fixity -> Bool) - ] - , testGroup "Text.Show.Text.Data.Dynamic" - [ testProperty "Dynamic instance" (prop_matchesShow :: Int -> Dynamic -> Bool) - ] - , testGroup "Text.Show.Text.Data.Either" - [ testProperty "Either Int Int instance" (prop_matchesShow :: Int -> Either Int Int -> Bool) - ] - , testGroup "Text.Show.Text.Data.Fixed" - [ testProperty "Fixed E0 instance" (prop_matchesShow :: Int -> Fixed E0 -> Bool) - , testProperty "Fixed E1 instance" (prop_matchesShow :: Int -> Fixed E1 -> Bool) - , testProperty "Fixed E2 instance" (prop_matchesShow :: Int -> Fixed E2 -> Bool) - , testProperty "Fixed E3 instance" (prop_matchesShow :: Int -> Fixed E3 -> Bool) - , testProperty "Fixed E6 instance" (prop_matchesShow :: Int -> Fixed E6 -> Bool) - , testProperty "Fixed E9 instance" (prop_matchesShow :: Int -> Fixed E9 -> Bool) - , testProperty "Fixed E12 instance" (prop_matchesShow :: Int -> Fixed E12 -> Bool) - , testProperty "showFixed output" prop_showFixed - ] - , testGroup "Text.Show.Text.Data.Floating" - [ testProperty "Float instance" (prop_matchesShow :: Int -> Float -> Bool) - , testProperty "Double instance" (prop_matchesShow :: Int -> Double -> Bool) - , testProperty "showbEFloat output" $ prop_showXFloat showEFloat showbEFloat - , testProperty "showbFFloat output" $ prop_showXFloat showFFloat showbFFloat - , testProperty "showbGFloat output" $ prop_showXFloat showGFloat showbGFloat -#if MIN_VERSION_base(4,7,0) - , testProperty "showbFFloatAlt output" $ prop_showXFloat showFFloatAlt showbFFloatAlt - , testProperty "showbGFloatAlt output" $ prop_showXFloat showGFloatAlt showbGFloatAlt -#endif - ] - , testGroup "Text.Show.Text.Data.Functions" - [ testProperty "Int -> Int instance" (prop_matchesShow :: Int -> (Int -> Int) -> Bool) - ] - , testGroup "Text.Show.Text.Data.Functor.Identity" - [ testProperty "Identity Int instance" (prop_matchesShow :: Int -> Identity Int -> Bool) - ] - , testGroup "Text.Show.Text.Data.Integral" - [ testProperty "Int instance" (prop_matchesShow :: Int -> Int -> Bool) - , testProperty "Int8 instance" (prop_matchesShow :: Int -> Int8 -> Bool) - , testProperty "Int16 instance" (prop_matchesShow :: Int -> Int16 -> Bool) - , testProperty "Int32 instance" (prop_matchesShow :: Int -> Int32 -> Bool) - , testProperty "Int64 instance" (prop_matchesShow :: Int -> Int64 -> Bool) - , testProperty "Integer instance" (prop_matchesShow :: Int -> Integer -> Bool) - , testProperty "Word instance" (prop_matchesShow :: Int -> Word -> Bool) - , testProperty "Word8 instance" (prop_matchesShow :: Int -> Word8 -> Bool) - , testProperty "Word16 instance" (prop_matchesShow :: Int -> Word16 -> Bool) - , testProperty "Word32 instance" (prop_matchesShow :: Int -> Word32 -> Bool) - , testProperty "Word64 instance" (prop_matchesShow :: Int -> Word64 -> Bool) -#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0) --- TODO: Figure out why this diverges on Windows - , testProperty "showbIntAtBase output" prop_showIntAtBase -#endif - ] - , testGroup "Text.Show.Text.Data.List" - [ testProperty "String instance" (prop_matchesShow :: Int -> String -> Bool) - , testProperty "[String] instance" (prop_matchesShow :: Int -> [String] -> Bool) - , testProperty "[Int] instance" (prop_matchesShow :: Int -> [Int] -> Bool) - , testProperty "showbListWith output" prop_showListWith - ] - , testGroup "Text.Show.Text.Data.Maybe" - [ testProperty "Maybe Int instance" (prop_matchesShow :: Int -> Maybe Int -> Bool) - ] - , testGroup "Text.Show.Text.Data.Monoid" - [ testProperty "All instance" (prop_matchesShow :: Int -> All -> Bool) - , testProperty "Any instance" (prop_matchesShow :: Int -> Any -> Bool) - , testProperty "Dual Int instance" (prop_matchesShow :: Int -> Dual Int -> Bool) - , testProperty "First (Maybe Int) instance" (prop_matchesShow :: Int -> First (Maybe Int) -> Bool) - , testProperty "Last (Maybe Int) instance" (prop_matchesShow :: Int -> Last (Maybe Int) -> Bool) - , testProperty "Product Int instance" (prop_matchesShow :: Int -> Product Int -> Bool) - , testProperty "Sum Int instance" (prop_matchesShow :: Int -> Sum Int -> Bool) -#if MIN_VERSION_base(4,8,0) - , testProperty "Alt Maybe Int instance" (prop_matchesShow :: Int -> Alt Maybe Int -> Bool) -#endif - ] -#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0)) - , testGroup "Text.Show.Text.Data.OldTypeable" - [ testProperty "TypeRep instance" (prop_matchesShow :: Int -> OldT.TypeRep -> Bool) - , testProperty "TyCon instance" (prop_matchesShow :: Int -> OldT.TyCon -> Bool) - ] -#endif - , testGroup "Text.Show.Text.Data.Ord" - [ testProperty "Ordering instance" (prop_matchesShow :: Int -> Ordering -> Bool) -#if MIN_VERSION_base(4,6,0) - , testProperty "Down Int instance" (prop_matchesShow :: Int -> Down Int -> Bool) -#endif - ] - , testGroup "Text.Show.Text.Data.Proxy" - [ testProperty "Proxy Int instance" (prop_matchesShow :: Int -> Proxy Int -> Bool) - ] - , testGroup "Text.Show.Text.Data.Ratio" - [ testProperty "Ratio Int instance" (prop_matchesShow :: Int -> Ratio Int -> Bool) - ] - , testGroup "Text.Show.Text.Data.Text" - [ testProperty "Builder instance" (prop_matchesShow :: Int -> Builder -> Bool) - , testProperty "strict Text instance" (prop_matchesShow :: Int -> TS.Text -> Bool) - , testProperty "lazy Text instance" (prop_matchesShow :: Int -> TL.Text -> Bool) - ] - , testGroup "Text.Show.Text.Data.Tuple" - [ testProperty "() instance" (prop_matchesShow :: Int -> () -> Bool) - , testProperty "(Int, Int) instance" (prop_matchesShow :: Int -> (Int, Int) -> Bool) - , testProperty "(Int, Int, Int) instance" (prop_matchesShow :: Int -> (Int, Int, Int) -> Bool) - , testProperty "(Int, Int, Int, Int) instance" (prop_matchesShow :: Int -> (Int, Int, Int, Int) -> Bool) - , testProperty "(Int, Int, Int, Int, Int) instance" (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int) -> Bool) - , testProperty "() generic show" (prop_genericShow :: Int -> () -> Bool) - , testProperty "(Int, Int) generic show" (prop_genericShow :: Int -> (Int, Int) -> Bool) - , testProperty "(Int, Int, Int) generic show" (prop_genericShow :: Int -> (Int, Int, Int) -> Bool) - , testProperty "(Int, Int, Int, Int) generic show" (prop_genericShow :: Int -> (Int, Int, Int, Int) -> Bool) - , testProperty "(Int, Int, Int, Int, Int) generic show" (prop_genericShow :: Int -> (Int, Int, Int, Int, Int) -> Bool) - ] -#if MIN_VERSION_base(4,7,0) - , testGroup "Text.Show.Text.Data.Type.Coercion" - [ testProperty "Coercion instance" (prop_matchesShow :: Int -> Coercion All Bool -> Bool) - ] - , testGroup "Text.Show.Text.Data.Type.Equality" - [ testProperty "(:~:) instance" (prop_matchesShow :: Int -> Int :~: Int -> Bool) - ] -#endif - , testGroup "Text.Show.Text.Data.Typeable" - [ testProperty "TypeRep instance" (prop_matchesShow :: Int -> NewT.TypeRep -> Bool) - , testProperty "TyCon instance" (prop_matchesShow :: Int -> NewT.TyCon -> Bool) - ] - , testGroup "Text.Show.Text.Data.Version" - [ testProperty "Version instance" (prop_matchesShow :: Int -> Version -> Bool) - , testProperty "showbVersionConcrete output" prop_showVersion - ] - , testGroup "Text.Show.Text.Foreign.C.Types" - [ testProperty "CChar" (prop_matchesShow :: Int -> CChar -> Bool) - , testProperty "CSChar instance" (prop_matchesShow :: Int -> CSChar -> Bool) - , testProperty "CUChar instance" (prop_matchesShow :: Int -> CUChar -> Bool) - , testProperty "CShort instance" (prop_matchesShow :: Int -> CShort -> Bool) - , testProperty "CUShort instance" (prop_matchesShow :: Int -> CUShort -> Bool) - , testProperty "CInt instance" (prop_matchesShow :: Int -> CInt -> Bool) - , testProperty "CUInt instance" (prop_matchesShow :: Int -> CUInt -> Bool) - , testProperty "CLong instance" (prop_matchesShow :: Int -> CLong -> Bool) - , testProperty "CULong instance" (prop_matchesShow :: Int -> CULong -> Bool) - , testProperty "CPtrdiff instance" (prop_matchesShow :: Int -> CPtrdiff -> Bool) - , testProperty "CSize instance" (prop_matchesShow :: Int -> CSize -> Bool) - , testProperty "CWchar instance" (prop_matchesShow :: Int -> CWchar -> Bool) - , testProperty "CSigAtomic instance" (prop_matchesShow :: Int -> CSigAtomic -> Bool) - , testProperty "CLLong instance" (prop_matchesShow :: Int -> CLLong -> Bool) - , testProperty "CULLong instance" (prop_matchesShow :: Int -> CULLong -> Bool) - , testProperty "CIntPtr instance" (prop_matchesShow :: Int -> CIntPtr -> Bool) - , testProperty "CUIntPtr instance" (prop_matchesShow :: Int -> CUIntPtr -> Bool) - , testProperty "CIntMax instance" (prop_matchesShow :: Int -> CIntMax -> Bool) - , testProperty "CUIntPtr instance" (prop_matchesShow :: Int -> CUIntPtr -> Bool) - , testProperty "CIntMax instance" (prop_matchesShow :: Int -> CIntMax -> Bool) - , testProperty "CUIntMax instance" (prop_matchesShow :: Int -> CUIntMax -> Bool) - , testProperty "CClock instance" (prop_matchesShow :: Int -> CClock -> Bool) - , testProperty "CTime instance" (prop_matchesShow :: Int -> CTime -> Bool) - , testProperty "CUSeconds instance" (prop_matchesShow :: Int -> CUSeconds -> Bool) - , testProperty "CSUSeconds instance" (prop_matchesShow :: Int -> CSUSeconds -> Bool) - , testProperty "CFloat instance" (prop_matchesShow :: Int -> CFloat -> Bool) - , testProperty "CDouble instance" (prop_matchesShow :: Int -> CUChar -> Bool) - ] - , testGroup "Text.Show.Text.Foreign.Ptr" - [ testProperty "Ptr Int instance" (prop_matchesShow :: Int -> Ptr Int -> Bool) - , testProperty "FunPtr Int instance" (prop_matchesShow :: Int -> FunPtr Int -> Bool) - , testProperty "IntPtr instance" (prop_matchesShow :: Int -> IntPtr -> Bool) - , testProperty "WordPtr instance" (prop_matchesShow :: Int -> WordPtr -> Bool) - , testProperty "ForeignPtr instance" prop_showForeignPtr - ] -#if !(defined(mingw32_HOST_OS) || defined(__GHCJS__)) - , testGroup "Text.Show.Text.GHC.Event" - [ testProperty "Event instance" (prop_matchesShow :: Int -> Event -> Bool) --- , testProperty "FdKey instance" (prop_matchesShow :: Int -> FdKey -> Bool) - ] -#endif - , testGroup "Text.Show.Text.Generic" - [ testProperty "ConType instance" (prop_matchesShow :: Int -> ConType -> Bool) - , testProperty "ConType generic show" (prop_genericShow :: Int -> ConType -> Bool) - ] -#if defined(mingw32_HOST_OS) && !(defined(__GHCJS__)) - , testGroup "Text.Show.Text.GHC.Conc.Windows" - [ testProperty "ConsoleEvent instance" (prop_matchesShow :: Int -> ConsoleEvent -> Bool) - ] -#endif - , testGroup "Text.Show.Text.GHC.Fingerprint" - [ testProperty "Fingerprint instance" (prop_matchesShow :: Int -> Fingerprint -> Bool) - ] - , testGroup "Text.Show.Text.GHC.Generics" - [ testProperty "U1 Int instance" (prop_matchesShow :: Int -> U1 Int -> Bool) - , testProperty "Par1 Int instance" (prop_matchesShow :: Int -> Par1 Int -> Bool) - , testProperty "Rec1 Maybe Int instance" (prop_matchesShow :: Int -> Rec1 Maybe Int -> Bool) - , testProperty "K1 () Int () instance" (prop_matchesShow :: Int -> K1 () Int () -> Bool) - , testProperty "M1 () () Maybe Int instance" (prop_matchesShow :: Int -> M1 () () Maybe Int -> Bool) - , testProperty "(Maybe :+: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :+: Maybe) Int -> Bool) - , testProperty "(Maybe :*: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :*: Maybe) Int -> Bool) - , testProperty "(Maybe :.: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :.: Maybe) Int -> Bool) - , testProperty "Fixity instance" (prop_matchesShow :: Int -> G.Fixity -> Bool) - , testProperty "Associativity instance" (prop_matchesShow :: Int -> Associativity -> Bool) - , testProperty "Arity instance" (prop_matchesShow :: Int -> Arity -> Bool) - ] -#if MIN_VERSION_base(4,8,0) - , testGroup "Text.Show.Text.GHC.RTS.Flags" - [ testProperty "RTSFlags instance" prop_showRTSFlags - , testProperty "GCFlags instance" prop_showGCFlags - , testProperty "ConcFlags instance" (prop_matchesShow :: Int -> ConcFlags -> Bool) - , testProperty "MiscFlags instance" (prop_matchesShow :: Int -> MiscFlags -> Bool) - , testProperty "DebugFlags instance" (prop_matchesShow :: Int -> DebugFlags -> Bool) - , testProperty "CCFlags instance" prop_showCCFlags - , testProperty "ProfFlags instance" prop_showProfFlags - , testProperty "TraceFlags instance" prop_showTraceFlags - , testProperty "TickyFlags instance" (prop_matchesShow :: Int -> TickyFlags -> Bool) - ] - , testGroup "Text.Show.Text.GHC.StaticPtr" - [ testProperty "StaticPtrInfo instance" (prop_matchesShow :: Int -> StaticPtrInfo -> Bool) - ] -#endif - , testGroup "Text.Show.Text.GHC.Stats" - [ testProperty "GCStats instance" (prop_matchesShow :: Int -> GCStats -> Bool) - ] -#if MIN_VERSION_base(4,6,0) - , testGroup "Text.Show.Text.GHC.TypeLits" - [ -# if MIN_VERSION_base(4,7,0) - testProperty "SomeNat instance" (prop_matchesShow :: Int -> SomeNat -> Bool) - , testProperty "SomeSymbol instance" (prop_matchesShow :: Int -> SomeSymbol -> Bool) --- # else --- testProperty "IsEven instance" (prop_matchesShow :: Int -> IsEven -> Bool) --- , testProperty "IsZero instance" (prop_matchesShow :: Int -> IsZero -> Bool) -# endif - ] -#endif - , testGroup "Text.Show.Text.Numeric.Natural" - [ testProperty "Natural instance" (prop_matchesShow :: Int -> Natural -> Bool) - ] - , testGroup "Text.Show.Text.System.Exit" - [ testProperty "ExitCode instance" (prop_matchesShow :: Int -> ExitCode -> Bool) - ] - , testGroup "Text.Show.Text.System.IO" - [ testProperty "Handle instance" (prop_matchesShow :: Int -> Handle -> Bool) - , testProperty "IOMode instance" (prop_matchesShow :: Int -> IOMode -> Bool) - , testProperty "BufferMode instance" (prop_matchesShow :: Int -> BufferMode -> Bool) - , testProperty "HandlePosn instance" (prop_matchesShow :: Int -> HandlePosn -> Bool) - , testProperty "SeekMode instance" (prop_matchesShow :: Int -> SeekMode -> Bool) - , testProperty "TextEncoding" prop_showTextEncoding - , testProperty "CodingProgress instance" (prop_matchesShow :: Int -> CodingProgress -> Bool) - , testProperty "CodingFailureMode instance" (prop_matchesShow :: Int -> CodingFailureMode -> Bool) - , testProperty "Newline instance" (prop_matchesShow :: Int -> Newline -> Bool) - , testProperty "NewlineMode instance" (prop_matchesShow :: Int -> NewlineMode -> Bool) - ] - , testGroup "Text.Show.Text.System.Posix.Types" - [ -#if defined(HTYPE_DEV_T) - testProperty "CDev instance" (prop_matchesShow :: Int -> CDev -> Bool) -#endif -#if defined(HTYPE_INO_T) - , testProperty "CIno instance" (prop_matchesShow :: Int -> CIno -> Bool) -#endif -#if defined(HTYPE_MODE_T) - , testProperty "CMode instance" (prop_matchesShow :: Int -> CMode -> Bool) -#endif -#if defined(HTYPE_OFF_T) - , testProperty "COff instance" (prop_matchesShow :: Int -> COff -> Bool) -#endif -#if defined(HTYPE_PID_T) - , testProperty "CPid instance" (prop_matchesShow :: Int -> CPid -> Bool) -#endif -#if defined(HTYPE_SSIZE_T) - , testProperty "CSsize instance" (prop_matchesShow :: Int -> CSsize -> Bool) -#endif -#if defined(HTYPE_GID_T) - , testProperty "CGid instance" (prop_matchesShow :: Int -> CGid -> Bool) -#endif -#if defined(HTYPE_NLINK_T) - , testProperty "CNlink instance" (prop_matchesShow :: Int -> CNlink -> Bool) -#endif -#if defined(HTYPE_UID_T) - , testProperty "CUid instance" (prop_matchesShow :: Int -> CUid -> Bool) -#endif -#if defined(HTYPE_CC_T) - , testProperty "CCc instance" (prop_matchesShow :: Int -> CCc -> Bool) -#endif -#if defined(HTYPE_SPEED_T) - , testProperty "CSpeed instance" (prop_matchesShow :: Int -> CSpeed -> Bool) -#endif -#if defined(HTYPE_TCFLAG_T) - , testProperty "CTcflag instance" (prop_matchesShow :: Int -> CTcflag -> Bool) -#endif -#if defined(HTYPE_RLIM_T) - , testProperty "CRLim instance" (prop_matchesShow :: Int -> CRLim -> Bool) -#endif - , testProperty "Fd instance" (prop_matchesShow :: Int -> Fd -> Bool) - ] - , testGroup "Text.Show.Text.Text.Read.Lex" - [ testProperty "Lexeme instance" (prop_matchesShow :: Int -> Lexeme -> Bool) -#if MIN_VERSION_base(4,7,0) - , testProperty "Number instance" (prop_matchesShow :: Int -> Number -> Bool) -#endif - ] - ]
− tests/Properties/Builder.hs
@@ -1,50 +0,0 @@-{-| -Module: Properties.Builder -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ properties for functions that manipulate 'Builder's. --} -module Properties.Builder (builderTests) where - -import Instances.BaseAndFriends () - -import Test.Tasty (TestTree, testGroup) -import Test.Tasty.QuickCheck (testProperty) - -import Text.Show.Text (Builder, fromString, fromText, lengthB, - toString, toText, unlinesB, unwordsB) - --- | Verifies 'lengthB' and 'length' produce the same output. -prop_lengthB :: String -> Bool -prop_lengthB s = fromIntegral (lengthB $ fromString s) == length s - --- | Verifies @fromText . toText = id@. -prop_toText :: Builder -> Bool -prop_toText b = fromText (toText b) == b - --- | Verifies @fromString . toString = id@. -prop_toString :: Builder -> Bool -prop_toString b = fromString (toString b) == b - --- | Verifies 'unlinesB' and 'unlines' produce the same output. -prop_unlinesB :: [String] -> Bool -prop_unlinesB strs = unlinesB (map fromString strs) == fromString (unlines strs) - --- | Verifies 'unwordsB' and 'unwords' produce the same output. -prop_unwordsB :: [String] -> Bool -prop_unwordsB strs = unwordsB (map fromString strs) == fromString (unwords strs) - -builderTests :: [TestTree] -builderTests = - [ testGroup "Builder-related functions" - [ testProperty "lengthB output" prop_lengthB - , testProperty "fromString . toString = id" prop_toString - , testProperty "fromText . toText = id" prop_toText - , testProperty "unlinesB output" prop_unlinesB - , testProperty "unwordsB output" prop_unwordsB - ] - ]
− tests/Properties/Derived.hs
@@ -1,112 +0,0 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE TypeOperators #-} -{-| -Module: Properties.BaseAndFriends -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ properties for data types that have derived 'Show' instances -(using "Text.Show.Text.TH"). --} -module Properties.Derived (derivedTests) where - -import Derived - -import Instances.Derived () - -import Properties.Utils (prop_matchesShow, prop_genericShow) - -import Test.Tasty (TestTree, testGroup) -import Test.Tasty.QuickCheck (testProperty) - -derivedTests :: [TestTree] -derivedTests = - [ testGroup "Template Haskell-derived data types" - [ testProperty "Nullary instance" (prop_matchesShow :: Int -> Nullary -> Bool) - , testProperty "PhantomNullary Int instance" (prop_matchesShow :: Int -> PhantomNullary Int -> Bool) - , testProperty "MonomorphicUnary instance" (prop_matchesShow :: Int -> MonomorphicUnary -> Bool) - , testProperty "PolymorphicUnary Int Int instance" (prop_matchesShow :: Int -> PolymorphicUnary Int Int -> Bool) - , testProperty "MonomorphicProduct instance" (prop_matchesShow :: Int -> MonomorphicProduct -> Bool) - , testProperty "PolymorphicProduct Int Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicProduct Int Int Int Int -> Bool) - , testProperty "MonomorphicRecord instance" (prop_matchesShow :: Int -> MonomorphicRecord -> Bool) - , testProperty "PolymorphicRecord Int Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicRecord Int Int Int Int -> Bool) - , testProperty "MonomorphicInfix instance" (prop_matchesShow :: Int -> MonomorphicInfix -> Bool) - , testProperty "PolymorphicInfix Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicInfix Int Int Int -> Bool) - , testProperty "MonomorphicForall instance" (prop_matchesShow :: Int -> MonomorphicForall -> Bool) - , testProperty "PolymorphicForall Int Int instance" (prop_matchesShow :: Int -> PolymorphicForall Int Int -> Bool) - , testProperty "AllAtOnce Int Int Int Int instance" (prop_matchesShow :: Int -> AllAtOnce Int Int Int Int -> Bool) - , testProperty "GADT Char Int Int instance" (prop_matchesShow :: Int -> GADT Char Int Int -> Bool) - , testProperty "GADT Double Double Int instance" (prop_matchesShow :: Int -> GADT Double Double Int -> Bool) - , testProperty "GADT Int String Int instance" (prop_matchesShow :: Int -> GADT Int String Int -> Bool) - , testProperty "GADT Ordering Int Int instance" (prop_matchesShow :: Int -> GADT Ordering Int Int -> Bool) - , testProperty "GADT Int Int Int instance" (prop_matchesShow :: Int -> GADT Int Int Int -> Bool) - , testProperty "PrimADT# Int instance" (prop_matchesShow :: Int -> PrimADT# Int -> Bool) - , testProperty "LeftAssocTree Int instance" (prop_matchesShow :: Int -> LeftAssocTree Int -> Bool) - , testProperty "RightAssocTree Int instance" (prop_matchesShow :: Int -> RightAssocTree Int -> Bool) - , testProperty "Int :?: Int instance" (prop_matchesShow :: Int -> Int :?: Int -> Bool) - , testProperty "HigherKindedTypeParams Maybe Int instance" (prop_matchesShow :: Int -> HigherKindedTypeParams Maybe Int -> Bool) - , testProperty "RestrictedContext Int instance" (prop_matchesShow :: Int -> RestrictedContext Int -> Bool) - , testProperty "Fix Maybe instance" (prop_matchesShow :: Int -> Fix Maybe -> Bool) -#if MIN_VERSION_template_haskell(2,7,0) - , testProperty "AllShow () () Int Int instance" (prop_matchesShow :: Int -> AllShow () () Int Int -> Bool) - , testProperty "AllShow Int Int Int Int instance" (prop_matchesShow :: Int -> AllShow Int Int Int Int -> Bool) - , testProperty "AllShow Bool Bool Int Int instance" (prop_matchesShow :: Int -> AllShow Bool Bool Int Int -> Bool) - , testProperty "AllShow Char Double Int Int instance" (prop_matchesShow :: Int -> AllShow Char Double Int Int -> Bool) - , testProperty "AllShow Float Ordering Int Int instance" (prop_matchesShow :: Int -> AllShow Float Ordering Int Int -> Bool) - , testProperty "NotAllShow Int Int Int Int instance" (prop_matchesShow :: Int -> NotAllShow Int Int Int Int -> Bool) - , testProperty "OneDataInstance Int Int Int Int instance" (prop_matchesShow :: Int -> OneDataInstance Int Int Int Int -> Bool) - , testProperty "AssocData1 () instance" (prop_matchesShow :: Int -> AssocData1 () -> Bool) - , testProperty "AssocData2 () instance" (prop_matchesShow :: Int -> AssocData2 () Int Int -> Bool) -# if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710 - , testProperty "NullaryData instance" (prop_matchesShow :: Int -> NullaryData -> Bool) -# endif - , testProperty "GADTFam Char Int Int instance" (prop_matchesShow :: Int -> GADTFam Char Int Int -> Bool) - , testProperty "GADTFam Double Double Int instance" (prop_matchesShow :: Int -> GADTFam Double Double Int -> Bool) - , testProperty "GADTFam Int String Int instance" (prop_matchesShow :: Int -> GADTFam Int String Int -> Bool) - , testProperty "GADTFam Ordering Int Int instance" (prop_matchesShow :: Int -> GADTFam Ordering Int Int -> Bool) - , testProperty "GADTFam Int Int Int instance" (prop_matchesShow :: Int -> GADTFam Int Int Int -> Bool) -#endif - , testProperty "Nullary generic show" (prop_genericShow :: Int -> Nullary -> Bool) - , testProperty "PhantomNullary Int generic show" (prop_genericShow :: Int -> PhantomNullary Int -> Bool) - , testProperty "MonomorphicUnary generic show" (prop_genericShow :: Int -> MonomorphicUnary -> Bool) - , testProperty "PolymorphicUnary Int Int generic show" (prop_genericShow :: Int -> PolymorphicUnary Int Int -> Bool) - , testProperty "MonomorphicProduct generic show" (prop_genericShow :: Int -> MonomorphicProduct -> Bool) - , testProperty "PolymorphicProduct Int Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicProduct Int Int Int Int -> Bool) - , testProperty "MonomorphicRecord generic show" (prop_genericShow :: Int -> MonomorphicRecord -> Bool) - , testProperty "PolymorphicRecord Int Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicRecord Int Int Int Int -> Bool) - , testProperty "MonomorphicInfix generic show" (prop_genericShow :: Int -> MonomorphicInfix -> Bool) - , testProperty "PolymorphicInfix Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicInfix Int Int Int -> Bool) --- , testProperty "MonomorphicForall generic show" (prop_genericShow :: Int -> MonomorphicForall -> Bool) --- , testProperty "PolymorphicForall Int Int generic show" (prop_genericShow :: Int -> PolymorphicForall Int Int -> Bool) --- , testProperty "AllAtOnce Int Int Int Int generic show" (prop_genericShow :: Int -> AllAtOnce Int Int Int Int -> Bool) --- , testProperty "GADT Char Int Int generic show" (prop_genericShow :: Int -> GADT Char Int Int -> Bool) --- , testProperty "GADT Double Double Int generic show" (prop_genericShow :: Int -> GADT Double Double Int -> Bool) --- , testProperty "GADT Int String Int generic show" (prop_genericShow :: Int -> GADT Int String Int -> Bool) --- , testProperty "GADT Ordering Int Int generic show" (prop_genericShow :: Int -> GADT Ordering Int Int -> Bool) --- , testProperty "GADT Int Int Int generic show" (prop_genericShow :: Int -> GADT Int Int Int -> Bool) - , testProperty "LeftAssocTree Int generic show" (prop_genericShow :: Int -> LeftAssocTree Int -> Bool) - , testProperty "RightAssocTree Int generic show" (prop_genericShow :: Int -> RightAssocTree Int -> Bool) - , testProperty "Int :?: Int generic show" (prop_genericShow :: Int -> Int :?: Int -> Bool) - , testProperty "HigherKindedTypeParams Maybe Int generic show" (prop_genericShow :: Int -> HigherKindedTypeParams Maybe Int -> Bool) - , testProperty "RestrictedContext Int generic show" (prop_genericShow :: Int -> RestrictedContext Int -> Bool) - , testProperty "Fix Maybe generic show" (prop_genericShow :: Int -> Fix Maybe -> Bool) -#if MIN_VERSION_template_haskell(2,7,0) && __GLASGOW_HASKELL__ >= 706 - , testProperty "AllShow () () Int Int generic show" (prop_matchesShow :: Int -> AllShow () () Int Int -> Bool) - , testProperty "AllShow Int Int Int Int generic show" (prop_matchesShow :: Int -> AllShow Int Int Int Int -> Bool) - , testProperty "AllShow Bool Bool Int Int generic show" (prop_matchesShow :: Int -> AllShow Bool Bool Int Int -> Bool) - , testProperty "AllShow Char Double Int Int generic show" (prop_matchesShow :: Int -> AllShow Char Double Int Int -> Bool) - , testProperty "AllShow Float Ordering Int Int generic show" (prop_matchesShow :: Int -> AllShow Float Ordering Int Int -> Bool) - , testProperty "NotAllShow Int Int Int Int generic show" (prop_genericShow :: Int -> NotAllShow Int Int Int Int -> Bool) - , testProperty "OneDataInstance Int Int Int Int generic show" (prop_genericShow :: Int -> OneDataInstance Int Int Int Int -> Bool) - , testProperty "AssocData1 () generic show" (prop_genericShow :: Int -> AssocData1 () -> Bool) - , testProperty "AssocData2 () generic show" (prop_genericShow :: Int -> AssocData2 () Int Int -> Bool) -# if __GLASGOW_HASKELL__ >= 708 - , testProperty "NullaryData generic show" (prop_genericShow :: Int -> NullaryData -> Bool) -# endif -#endif - ] - ]
− tests/Properties/MkShow.hs
@@ -1,133 +0,0 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} -#if __GLASGOW_HASKELL__ < 706 --- Template Haskell's name generation didn't name-mangle very well prior to GHC --- 7.6 and can cause name shadowing warnings, so suppress them. -{-# OPTIONS_GHC -fno-warn-name-shadowing #-} -#endif -{-| -Module: Properties.MkShow -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ properties for 'mkShowbPrec' in "Text.Show.Text.TH". --} -module Properties.MkShow (mkShowTests) where - --- #if !(MIN_VERSION_base(4,8,0)) --- import Control.Applicative ((*>), pure) --- #endif - --- import Debug.Trace (traceShow) - -import Derived (AllAtOnce) -#if MIN_VERSION_template_haskell(2,7,0) -import Derived (NotAllShow(..), OneDataInstance) -#endif - -import Instances.Derived () - --- import Properties.Utils (ioProperty) - --- import System.IO (hFlush, stdout, stderr) --- import System.IO.Silently (capture_, hCapture_) - -import Test.Tasty (TestTree, testGroup) -import Test.Tasty.QuickCheck (testProperty) - -import qualified Text.Show as S (Show) -import Text.Show.Text (Builder, FromStringShow(..), showbPrec) --- import Text.Show.Text.Debug.Trace.TH (mkTraceShow) -import Text.Show.Text.TH (mkShowbPrec) - --- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'. -prop_mkShowbPrec :: S.Show a - => (Int -> a -> Builder) -- ^ TH-generated 'mkShowbPrec' function - -> Int -> a -> Bool -prop_mkShowbPrec sf p x = showbPrec p (FromStringShow x) == sf p x - --- -- | Verifies 'mkPrint' produces the same output as 'print'. --- prop_mkPrint :: S.Show a --- => (a -> IO ()) -- ^ TH-generated 'mkPrint' function --- -> a -> Property --- prop_mkPrint pf x = ioProperty $ do --- sRes <- capture_ $ print x *> hFlush stdout --- tRes <- capture_ $ pf x *> hFlush stdout --- pure $ sRes == tRes --- --- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'. --- prop_mkTraceShow :: S.Show a --- => (a -> IO () -> IO ()) -- ^ TH-generated 'mkTraceShow' function --- -> a -> Property --- prop_mkTraceShow tsf x = ioProperty $ do --- let handles = [stdout, stderr] --- sRes <- hCapture_ handles $ traceShow x (pure ()) *> mapM_ hFlush handles --- tRes <- hCapture_ handles $ tsf x (pure ()) *> mapM_ hFlush handles --- pure $ sRes == tRes - --- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec' . --- This uses a plain type constructor. -prop_mkShowbPrecTyCon :: Int -> AllAtOnce Int Int Int Int -> Bool -prop_mkShowbPrecTyCon = prop_mkShowbPrec $(mkShowbPrec ''AllAtOnce) - --- -- | Verifies 'mkPrint' produces the same output as 'print'. --- -- This uses a plain type constructor. --- prop_mkPrintTyCon :: AllAtOnce Int Int Int Int -> Property --- prop_mkPrintTyCon = prop_mkPrint $(mkPrint ''AllAtOnce) --- --- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'. --- -- This uses a plain type constructor. --- prop_mkTraceShowTyCon :: AllAtOnce Int Int Int Int -> Property --- prop_mkTraceShowTyCon = prop_mkTraceShow $(mkTraceShow ''AllAtOnce) - -#if MIN_VERSION_template_haskell(2,7,0) --- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'. --- This uses a data family name. -prop_mkShowbPrecDataFam :: Int -> OneDataInstance Int Int Int Int -> Bool -prop_mkShowbPrecDataFam = prop_mkShowbPrec $(mkShowbPrec ''OneDataInstance) - --- -- | Verifies 'mkPrint' produces the same output as 'print'. --- -- This uses a data family name. --- prop_mkPrintDataFam :: OneDataInstance Int Int Int Int -> Property --- prop_mkPrintDataFam = prop_mkPrint $(mkPrint ''OneDataInstance) --- --- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'. --- -- This uses a data family name. --- prop_mkTraceShowDataFam :: OneDataInstance Int Int Int Int -> Property --- prop_mkTraceShowDataFam = prop_mkTraceShow $(mkTraceShow ''OneDataInstance) - --- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'. --- This uses a data family instance constructor. -prop_mkShowbPrecDataFamInstCon :: Int -> NotAllShow Int Int Int Int -> Bool -prop_mkShowbPrecDataFamInstCon = prop_mkShowbPrec $(mkShowbPrec 'NASShow1) - --- -- | Verifies 'mkPrint' produces the same output as 'print'. --- -- This uses a data family instance constructor. --- prop_mkPrintDataFamInstCon :: NotAllShow Int Int Int Int -> Property --- prop_mkPrintDataFamInstCon = prop_mkPrint $(mkPrint 'NASShow1) --- --- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'. --- -- This uses a data family instance constructor. --- prop_mkTraceShowDataFamInstCon :: NotAllShow Int Int Int Int -> Property --- prop_mkTraceShowDataFamInstCon = prop_mkTraceShow $(mkTraceShow 'NASShow1) -#endif - -mkShowTests :: [TestTree] -mkShowTests = - [ testGroup "mkShow and related functions" - [ testProperty "$(mkShowbPrec ''AllAtOnce) (a plain type constructor)" prop_mkShowbPrecTyCon --- , testProperty "$(mkPrint ''AllAtOnce) (a plain type constructor)" prop_mkPrintTyCon --- , testProperty "$(mkTraceShow ''AllAtOnce) (a plain type constructor)" prop_mkTraceShowTyCon -#if MIN_VERSION_template_haskell(2,7,0) - , testProperty "$(mkShowbPrec ''NotAllShow) (a data family instance constructor)" prop_mkShowbPrecDataFamInstCon --- , testProperty "$(mkPrint ''NotAllShow) (a data family instance constructor)" prop_mkPrintDataFamInstCon --- , testProperty "$(mkTraceShow ''NotAllShow) (a data family instance constructor)" prop_mkTraceShowDataFamInstCon - , testProperty "$(mkShowbPrec ''OneDataInstance) (a data family name)" prop_mkShowbPrecDataFam --- , testProperty "$(mkPrint ''OneDataInstance) (a data family name)" prop_mkPrintDataFam --- , testProperty "$(mkTraceShow ''OneDataInstance) (a data family name)" prop_mkTraceShowDataFam -#endif - ] - ]
− tests/Properties/Utils.hs
@@ -1,64 +0,0 @@-{-# LANGUAGE CPP #-} -{-# LANGUAGE FlexibleContexts #-} -{-| -Module: Properties.Utils -Copyright: (C) 2014-2015 Ryan Scott -License: BSD-style (see the file LICENSE) -Maintainer: Ryan Scott -Stability: Experimental -Portability: GHC - -@QuickCheck@ property-related utility functions. --} -module Properties.Utils ( - ioProperty - , prop_matchesShow - , prop_genericShow - , prop_readShow - , prop_showEq - ) where - -import GHC.Generics (Generic, Rep) - -import Prelude hiding (Show) - -#if MIN_VERSION_QuickCheck(2,7,0) -import qualified Test.Tasty.QuickCheck as QC (ioProperty) -#else -import Test.Tasty.QuickCheck (morallyDubiousIOProperty) -#endif -import Test.Tasty.QuickCheck (Property, Testable) - -import qualified Text.Show as S (Show) -import qualified Text.Show.Text as T (Show) -import Text.Show.Text hiding (Show) -import Text.Show.Text.Generic - -ioProperty :: Testable prop => IO prop -> Property -#if MIN_VERSION_QuickCheck(2,7,0) -ioProperty = QC.ioProperty -#else -ioProperty = morallyDubiousIOProperty -#endif - --- | Verifies that a type's @Show@ instances coincide for both 'String's and 'Text', --- irrespective of precedence. -prop_matchesShow :: (S.Show a, T.Show a) => Int -> a -> Bool -prop_matchesShow p x = showbPrec p (FromStringShow x) == showbPrec p x - --- | Verifies that a type's @Show@ instance coincides with the output produced --- by the equivalent 'Generic' functions. --- TODO: Add other generic functions --- TODO: Put in tuples -prop_genericShow :: (S.Show a, T.Show a, Generic a, GShow (Rep a)) - => Int -> a -> Bool -prop_genericShow p x = showbPrec p x == genericShowbPrec p x - --- | Verifies that @read . show = id@. -prop_readShow :: (Eq a, Read a, S.Show a) => Int -> a -> Bool -prop_readShow p x = read (showsPrec p x "") == x - --- | Verifies that two type's @Show@ instances produce identical output, where the first --- type is a wrapper around the second type. -prop_showEq :: (T.Show a, T.Show b) => (a -> b) -> Int -> a -> Bool -prop_showEq f p x = showbPrec p (f x) == showbPrec p x
+ tests/Spec.hs view
@@ -0,0 +1,1 @@+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
+ tests/Spec/BuilderSpec.hs view
@@ -0,0 +1,50 @@+{-|+Module: Spec.BuilderSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for functions that manipulate 'Builder's.+-}+module Spec.BuilderSpec (main, spec) where++import Instances.Data.Text ()++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text (Builder, fromString, fromText, lengthB,+ toString, toText, unlinesB, unwordsB)++main :: IO ()+main = hspec spec++-- | Verifies 'lengthB' and 'length' produce the same output.+prop_lengthB :: String -> Bool+prop_lengthB s = fromIntegral (lengthB $ fromString s) == length s++-- | Verifies @fromText . toText = id@.+prop_toText :: Builder -> Bool+prop_toText b = fromText (toText b) == b++-- | Verifies @fromString . toString = id@.+prop_toString :: Builder -> Bool+prop_toString b = fromString (toString b) == b++-- | Verifies 'unlinesB' and 'unlines' produce the same output.+prop_unlinesB :: [String] -> Bool+prop_unlinesB strs = unlinesB (map fromString strs) == fromString (unlines strs)++-- | Verifies 'unwordsB' and 'unwords' produce the same output.+prop_unwordsB :: [String] -> Bool+prop_unwordsB strs = unwordsB (map fromString strs) == fromString (unwords strs)++spec :: Spec+spec = parallel . describe "Builder-related functions" $ do+ prop "lengthB output" prop_lengthB+ prop "fromString . toString = id" prop_toString+ prop "fromText . toText = id" prop_toText+ prop "unlinesB output" prop_unlinesB+ prop "unwordsB output" prop_unwordsB
+ tests/Spec/Control/ApplicativeSpec.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Control.ApplicativeSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Control.Applicative" module.+-}+module Spec.Control.ApplicativeSpec (main, spec) where++import Control.Applicative (Const, ZipList)++import Data.Orphans ()++import Instances.Control.Applicative ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Control.Applicative" $ do+ prop "Const Int Int instance" (prop_matchesShow :: Int -> Const Int Int -> Bool)+ prop "ZipList Int instance" (prop_matchesShow :: Int -> ZipList Int -> Bool)+#if __GLASGOW_HASKELL__ >= 702+ prop "ZipList Int generic show" (prop_genericShow :: Int -> ZipList Int -> Bool)+#endif
+ tests/Spec/Control/ConcurrentSpec.hs view
@@ -0,0 +1,31 @@+module Spec.Control.ConcurrentSpec (main, spec) where++import Control.Concurrent (myThreadId)++import GHC.Conc (BlockReason, ThreadStatus)++import Instances.Control.Concurrent ()++import Prelude ()+import Prelude.Compat++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Property, ioProperty)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Control.Concurrent" $ do+ prop "BlockReason instance" (prop_matchesShow :: Int -> BlockReason -> Bool)+ prop "ThreadId instance" prop_showThreadId+ prop "ThreadStatus instance" (prop_matchesShow :: Int -> ThreadStatus -> Bool)++-- | Verifies the 'Show' instance for 'ThreadId' is accurate.+prop_showThreadId :: Int -> Property+prop_showThreadId p = ioProperty $ do+ tid <- myThreadId+ pure $ prop_matchesShow p tid
+ tests/Spec/Control/ExceptionSpec.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Control.ExceptionSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Control.Exception" module.+-}+module Spec.Control.ExceptionSpec (main, spec) where++import Control.Exception++import Instances.Control.Exception ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Control.Exception" $ do+ prop "SomeException instance" (prop_matchesShow :: Int -> SomeException -> Bool)+ prop "IOException instance" (prop_matchesShow :: Int -> IOException -> Bool)+ prop "ArithException instance" (prop_matchesShow :: Int -> ArithException -> Bool)+ prop "ArrayException instance" (prop_matchesShow :: Int -> ArrayException -> Bool)+ prop "AssertionFailed instance" (prop_matchesShow :: Int -> AssertionFailed -> Bool)+#if MIN_VERSION_base(4,7,0)+ prop "SomeAsyncException instance" (prop_matchesShow :: Int -> SomeAsyncException -> Bool)+#endif+ prop "AsyncException instance" (prop_matchesShow :: Int -> AsyncException -> Bool)+ prop "NonTermination instance" (prop_matchesShow :: Int -> NonTermination -> Bool)+ prop "NestedAtomically instance" (prop_matchesShow :: Int -> NestedAtomically -> Bool)+ prop "BlockedIndefinitelyOnMVar instance" (prop_matchesShow :: Int -> BlockedIndefinitelyOnMVar -> Bool)+ prop "BlockedIndefinitelyOnSTM instance" (prop_matchesShow :: Int -> BlockedIndefinitelyOnSTM -> Bool)+#if MIN_VERSION_base(4,8,0)+ prop "AllocationLimitExceeded instance" (prop_matchesShow :: Int -> AllocationLimitExceeded -> Bool)+#endif+ prop "Deadlock instance" (prop_matchesShow :: Int -> Deadlock -> Bool)+ prop "NoMethodError instance" (prop_matchesShow :: Int -> NoMethodError -> Bool)+ prop "PatternMatchFail instance" (prop_matchesShow :: Int -> PatternMatchFail -> Bool)+ prop "RecConError instance" (prop_matchesShow :: Int -> RecConError -> Bool)+ prop "RecSelError instance" (prop_matchesShow :: Int -> RecSelError -> Bool)+ prop "RecUpdError instance" (prop_matchesShow :: Int -> RecUpdError -> Bool)+ prop "ErrorCall instance" (prop_matchesShow :: Int -> ErrorCall -> Bool)+ prop "MaskingState instance" (prop_matchesShow :: Int -> MaskingState -> Bool)
+ tests/Spec/Control/Monad/STSpec.hs view
@@ -0,0 +1,17 @@+module Spec.Control.Monad.STSpec (main, spec) where++import Control.Monad.ST++import Instances.Control.Monad.ST ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Control.Monad.ST" $+ prop "ST instance" (prop_matchesShow :: Int -> ST Int Int -> Bool)
+ tests/Spec/Data/ArraySpec.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.ArraySpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for array data types.+-}+module Spec.Data.ArraySpec (main, spec) where++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)+import Test.QuickCheck.Instances ()++#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)+import Data.Array (Array)+import Data.Array.Unboxed (UArray)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)+-- TODO: Figure out why these tests diverge on Windows+ describe "Text.Show.Text.Data.Array" $ do+ prop "Array Int Int instance" (prop_matchesShow :: Int -> Array Int Int -> Bool)+ prop "UArray Int Int instance" (prop_matchesShow :: Int -> UArray Int Int -> Bool)+#else+ pure ()+#endif
+ tests/Spec/Data/BoolSpec.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.BoolSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Bool'.+-}+module Spec.Data.BoolSpec (main, spec) where++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Bool" $ do+ prop "Bool instance" (prop_matchesShow :: Int -> Bool -> Bool)+#if __GLASGOW_HASKELL__ >= 702+ prop "Bool generic show" (prop_genericShow :: Int -> Bool -> Bool)+#endif
+ tests/Spec/Data/ByteStringSpec.hs view
@@ -0,0 +1,32 @@+{-|+Module: Spec.Data.ByteStringSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the @bytestring@ library.+-}+module Spec.Data.ByteStringSpec (main, spec) where++import qualified Data.ByteString as BS (ByteString)+import qualified Data.ByteString.Lazy as BL (ByteString)+import Data.ByteString.Short (ShortByteString)++import Instances.Data.ByteString ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck.Instances ()++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.ByteString" $ do+ prop "strict ByteString instance" (prop_matchesShow :: Int -> BS.ByteString -> Bool)+ prop "lazy ByteString instance" (prop_matchesShow :: Int -> BL.ByteString -> Bool)+ prop "ShortByteString instance" (prop_matchesShow :: Int -> ShortByteString -> Bool)
+ tests/Spec/Data/CharSpec.hs view
@@ -0,0 +1,35 @@+{-|+Module: Spec.Data.CharSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Char" module.+-}+module Spec.Data.CharSpec (main, spec) where++import Data.Array (elems)+import Data.Char (GeneralCategory)++import GHC.Show (asciiTab)++import Instances.Data.Char ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, it, parallel, shouldBe)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text (fromString)+import Text.Show.Text.Data.Char (asciiTabB)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Char" $ do+ prop "Char instance" (prop_matchesShow :: Int -> Char -> Bool)+ prop "GeneralCategory instance" (prop_matchesShow :: Int -> GeneralCategory -> Bool)+ it "asciiTab = asciiTabB" $ map fromString asciiTab `shouldBe` elems asciiTabB
+ tests/Spec/Data/ComplexSpec.hs view
@@ -0,0 +1,25 @@+{-|+Module: Spec.Data.ComplexSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Complex'.+-}+module Spec.Data.ComplexSpec (main, spec) where++import Data.Complex (Complex)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Complex" $+ prop "Complex Double instance" (prop_matchesShow :: Int -> Complex Double -> Bool)
+ tests/Spec/Data/DataSpec.hs view
@@ -0,0 +1,31 @@+{-|+Module: Spec.Data.DataSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Data" module.+-}+module Spec.Data.DataSpec (main, spec) where++import Data.Data (Constr, ConstrRep, DataRep, DataType, Fixity)++import Instances.Data.Data ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Data" $ do+ prop "Constr instance" (prop_matchesShow :: Int -> Constr -> Bool)+ prop "ConstrRep instance" (prop_matchesShow :: Int -> ConstrRep -> Bool)+ prop "DataRep instance" (prop_matchesShow :: Int -> DataRep -> Bool)+ prop "DataType instance" (prop_matchesShow :: Int -> DataType -> Bool)+ prop "Fixity instance" (prop_matchesShow :: Int -> Fixity -> Bool)
+ tests/Spec/Data/DynamicSpec.hs view
@@ -0,0 +1,27 @@+{-|+Module: Spec.Data.DynamicSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Dynamic'.+-}+module Spec.Data.DynamicSpec (main, spec) where++import Data.Dynamic (Dynamic)++import Instances.Data.Dynamic ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Dynamic" $+ prop "Dynamic instance" (prop_matchesShow :: Int -> Dynamic -> Bool)
+ tests/Spec/Data/EitherSpec.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.EitherSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Either'.+-}+module Spec.Data.EitherSpec (main, spec) where++import Data.Orphans ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Either" $ do+ prop "Either Int Int instance" (prop_matchesShow :: Int -> Either Int Int -> Bool)+#if __GLASGOW_HASKELL__ >= 702+ prop "Either Int Int generic show" (prop_genericShow :: Int -> Either Int Int -> Bool)+#endif
+ tests/Spec/Data/FixedSpec.hs view
@@ -0,0 +1,39 @@+{-|+Module: Spec.Data.FixedSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Fixed' values.+-}+module Spec.Data.FixedSpec (main, spec) where++import Data.Fixed (Fixed, E0, E1, E2, E3, E6, E9, E12, showFixed)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text (fromString)+import Text.Show.Text.Data.Fixed (showbFixed)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Fixed" $ do+ prop "Fixed E0 instance" (prop_matchesShow :: Int -> Fixed E0 -> Bool)+ prop "Fixed E1 instance" (prop_matchesShow :: Int -> Fixed E1 -> Bool)+ prop "Fixed E2 instance" (prop_matchesShow :: Int -> Fixed E2 -> Bool)+ prop "Fixed E3 instance" (prop_matchesShow :: Int -> Fixed E3 -> Bool)+ prop "Fixed E6 instance" (prop_matchesShow :: Int -> Fixed E6 -> Bool)+ prop "Fixed E9 instance" (prop_matchesShow :: Int -> Fixed E9 -> Bool)+ prop "Fixed E12 instance" (prop_matchesShow :: Int -> Fixed E12 -> Bool)+ prop "showFixed output" prop_showFixed++-- | Verifies 'showFixed' and 'showbFixed' generate the same output.+prop_showFixed :: Bool -> Fixed E12 -> Bool+prop_showFixed b f = fromString (showFixed b f) == showbFixed b f
+ tests/Spec/Data/FloatingSpec.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.FloatingSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for floating-point data types.+-}+module Spec.Data.FloatingSpec (main, spec) where++import Data.Text.Lazy.Builder.RealFloat (FPFormat)++import Instances.Data.Floating ()++import Numeric.Compat (showEFloat, showFFloat, showGFloat,+ showFFloatAlt, showGFloatAlt)++import Prelude ()+import Prelude.Compat++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Gen, arbitrary, suchThat)++import Text.Show.Text (Builder, fromString)+import Text.Show.Text.Data.Floating (showbEFloat, showbFFloat, showbGFloat,+ showbFFloatAlt, showbGFloatAlt)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Floating" $ do+ prop "Float instance" (prop_matchesShow :: Int -> Float -> Bool)+ prop "Double instance" (prop_matchesShow :: Int -> Double -> Bool)+ prop "showbEFloat output" $ prop_showXFloat showEFloat showbEFloat+ prop "showbFFloat output" $ prop_showXFloat showFFloat showbFFloat+ prop "showbGFloat output" $ prop_showXFloat showGFloat showbGFloat+ prop "showbFFloatAlt output" $ prop_showXFloat showFFloatAlt showbFFloatAlt+ prop "showbGFloatAlt output" $ prop_showXFloat showGFloatAlt showbGFloatAlt+ prop "FPFormat instance" (prop_matchesShow :: Int -> FPFormat -> Bool)++-- | Verifies @showXFloat@ and @showbXFloat@ generate the same output (where @X@+-- is one of E, F, or G).+prop_showXFloat :: (Maybe Int -> Double -> ShowS) -> (Maybe Int -> Double -> Builder) -> Double -> Gen Bool+prop_showXFloat f1 f2 val = do+ digs <- arbitrary `suchThat` (<= 10)+ pure $ fromString (f1 (Just digs) val "") == f2 (Just digs) val
+ tests/Spec/Data/Functor/IdentitySpec.hs view
@@ -0,0 +1,28 @@+{-|+Module: Spec.Data.Functor.Identity+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Identity'.+-}+module Spec.Data.Functor.IdentitySpec (main, spec) where++import Data.Functor.Classes ()+import Data.Functor.Identity (Identity)++import Instances.Data.Functor.Identity ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Functor.Identity" $ + prop "Identity Int instance" (prop_matchesShow :: Int -> Identity Int -> Bool)
+ tests/Spec/Data/IntegralSpec.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.IntegralSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for integral data types.+-}+module Spec.Data.IntegralSpec (main, spec) where++import Data.Int (Int8, Int16, Int32, Int64)+import Data.Word (Word8, Word16, Word32, Word64)++import Prelude ()+import Prelude.Compat++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)+import Control.Applicative (liftA2)+import Data.Char (intToDigit)+import Numeric (showIntAtBase)+import Test.QuickCheck (Gen, arbitrary, getNonNegative, suchThat)++import Text.Show.Text (fromString)+import Text.Show.Text.Data.Integral (showbIntAtBase)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Integral" $ do+ prop "Int instance" (prop_matchesShow :: Int -> Int -> Bool)+ prop "Int8 instance" (prop_matchesShow :: Int -> Int8 -> Bool)+ prop "Int16 instance" (prop_matchesShow :: Int -> Int16 -> Bool)+ prop "Int32 instance" (prop_matchesShow :: Int -> Int32 -> Bool)+ prop "Int64 instance" (prop_matchesShow :: Int -> Int64 -> Bool)+ prop "Integer instance" (prop_matchesShow :: Int -> Integer -> Bool)+ prop "Word instance" (prop_matchesShow :: Int -> Word -> Bool)+ prop "Word8 instance" (prop_matchesShow :: Int -> Word8 -> Bool)+ prop "Word16 instance" (prop_matchesShow :: Int -> Word16 -> Bool)+ prop "Word32 instance" (prop_matchesShow :: Int -> Word32 -> Bool)+ prop "Word64 instance" (prop_matchesShow :: Int -> Word64 -> Bool)+#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)+-- TODO: Figure out why this diverges on Windows+ prop "showbIntAtBase output" prop_showIntAtBase+#endif++-- | Verifies 'showIntAtBase' and 'showbIntAtBase' generate the same output.+#if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)+prop_showIntAtBase :: Gen Bool+prop_showIntAtBase = do+ base <- arbitrary `suchThat` liftA2 (&&) (> 1) (<= 16)+ i <- getNonNegative <$> arbitrary :: Gen Int+ pure $ fromString (showIntAtBase base intToDigit i "") == showbIntAtBase base intToDigit i+#endif
+ tests/Spec/Data/ListSpec.hs view
@@ -0,0 +1,34 @@+{-|+Module: Spec.Data.ListSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for lists.+-}+module Spec.Data.ListSpec (main, spec) where++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show (showListWith)+import Text.Show.Text (fromString, showb)+import Text.Show.Text.Data.List (showbListWith)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.List" $ do+ prop "String instance" (prop_matchesShow :: Int -> String -> Bool)+ prop "[String] instance" (prop_matchesShow :: Int -> [String] -> Bool)+ prop "[Int] instance" (prop_matchesShow :: Int -> [Int] -> Bool)+ prop "showbListWith output" prop_showListWith++-- | Verifies 'showListWith' and 'showbListWith' generate the same output.+prop_showListWith :: String -> Bool+prop_showListWith str = fromString (showListWith shows str "") == showbListWith showb str
+ tests/Spec/Data/MaybeSpec.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.MaybeSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Maybe'.+-}+module Spec.Data.MaybeSpec (main, spec) where++import Data.Orphans ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Maybe" $ do+ prop "Maybe Int instance" (prop_matchesShow :: Int -> Maybe Int -> Bool)+#if __GLASGOW_HASKELL__ >= 702+ prop "Maybe Int generic show" (prop_genericShow :: Int -> Maybe Int -> Bool)+#endif
+ tests/Spec/Data/MonoidSpec.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.MonoidSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Monoid" module.+-}+module Spec.Data.MonoidSpec (main, spec) where++import Data.Monoid+import Data.Orphans ()++import Instances.Data.Monoid ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Monoid" $ do+ prop "All instance" (prop_matchesShow :: Int -> All -> Bool)+ prop "Any instance" (prop_matchesShow :: Int -> Any -> Bool)+ prop "Dual Int instance" (prop_matchesShow :: Int -> Dual Int -> Bool)+ prop "First (Maybe Int) instance" (prop_matchesShow :: Int -> First (Maybe Int) -> Bool)+ prop "Last (Maybe Int) instance" (prop_matchesShow :: Int -> Last (Maybe Int) -> Bool)+ prop "Product Int instance" (prop_matchesShow :: Int -> Product Int -> Bool)+ prop "Sum Int instance" (prop_matchesShow :: Int -> Sum Int -> Bool)+#if MIN_VERSION_base(4,8,0)+ prop "Alt Maybe Int instance" (prop_matchesShow :: Int -> Alt Maybe Int -> Bool)+#endif+#if __GLASGOW_HASKELL__ >= 702+ prop "All generic show" (prop_genericShow :: Int -> All -> Bool)+ prop "Any generic show" (prop_genericShow :: Int -> Any -> Bool)+ prop "Dual Int generic show" (prop_genericShow :: Int -> Dual Int -> Bool)+ prop "First (Maybe Int) generic show" (prop_genericShow :: Int -> First (Maybe Int) -> Bool)+ prop "Last (Maybe Int) generic show" (prop_genericShow :: Int -> Last (Maybe Int) -> Bool)+ prop "Product Int generic show" (prop_genericShow :: Int -> Product Int -> Bool)+ prop "Sum Int generic show" (prop_genericShow :: Int -> Sum Int -> Bool)+#endif+#if MIN_VERSION_base(4,8,0)+ prop "Alt Maybe Int generic show" (prop_genericShow :: Int -> Alt Maybe Int -> Bool)+#endif
+ tests/Spec/Data/OldTypeableSpec.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}+#endif++{-|+Module: Spec.Data.OldTypeableSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Monoid" module.+-}+module Spec.Data.OldTypeableSpec (main, spec) where++import Instances.Data.OldTypeable ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+import Data.OldTypeable (TyCon, TypeRep)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))+ describe "Text.Show.Text.Data.OldTypeable" $ do+ prop "TypeRep instance" (prop_matchesShow :: Int -> TypeRep -> Bool)+ prop "TyCon instance" (prop_matchesShow :: Int -> TyCon -> Bool)+#else+ pure ()+#endif
+ tests/Spec/Data/OrdSpec.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.OrdSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Ord" module.+-}+module Spec.Data.OrdSpec (main, spec) where++#if MIN_VERSION_base(4,6,0)+import Data.Ord (Down)+#endif+import Data.Orphans ()++import Instances.Data.Ord ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Ord" $ do+ prop "Ordering instance" (prop_matchesShow :: Int -> Ordering -> Bool)+#if __GLASGOW_HASKELL__ >= 702+ prop "Ordering generic show" (prop_genericShow :: Int -> Ordering -> Bool)+#endif+#if MIN_VERSION_base(4,6,0)+ prop "Down Int instance" (prop_matchesShow :: Int -> Down Int -> Bool)+#endif
+ tests/Spec/Data/ProxySpec.hs view
@@ -0,0 +1,32 @@+{-|+Module: Spec.Data.ProxySpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Proxy'.+-}+module Spec.Data.ProxySpec (main, spec) where++import Data.Proxy (Proxy)++import Instances.Data.Proxy ()++import Spec.Utils (prop_matchesShow)+-- #if __GLASGOW_HASKELL__ >= 702+-- import Spec.Utils (prop_genericShow)+-- #endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Proxy" $ do+ prop "Proxy Int instance" (prop_matchesShow :: Int -> Proxy Int -> Bool)+ -- TODO: Uncomment this once tagged is fixed+-- prop "Proxy Int generic show" (prop_genericShow :: Int -> Proxy Int -> Bool)
+ tests/Spec/Data/RatioSpec.hs view
@@ -0,0 +1,25 @@+{-|+Module: Spec.Data.RatioSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Ratio'.+-}+module Spec.Data.RatioSpec (main, spec) where++import Data.Ratio (Ratio)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Ratio" $ do+ prop "Ratio Int instance" (prop_matchesShow :: Int -> Ratio Int -> Bool)
+ tests/Spec/Data/TextSpec.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.TextSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the @text@ library.+-}+module Spec.Data.TextSpec (main, spec) where++import Instances.Data.Text ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import qualified Data.Text as TS+import qualified Data.Text as TL+#if MIN_VERSION_text(1,0,0)+import Data.Text.Encoding (Decoding)+#endif+import Data.Text.Encoding.Error (UnicodeException)+import Data.Text.Foreign (I16)+#if MIN_VERSION_text(1,1,0)+import Data.Text.Internal.Fusion.Size (Size)+#endif+import Data.Text.Lazy.Builder (Builder)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Text" $ do+ prop "Builder instance" (prop_matchesShow :: Int -> Builder -> Bool)+ prop "strict Text instance" (prop_matchesShow :: Int -> TS.Text -> Bool)+ prop "lazy Text instance" (prop_matchesShow :: Int -> TL.Text -> Bool)+ prop "I16 instance" (prop_matchesShow :: Int -> I16 -> Bool)+ prop "UnicodeException instance" (prop_matchesShow :: Int -> UnicodeException -> Bool)+#if MIN_VERSION_text(1,0,0)+ prop "Decoding instance" (prop_matchesShow :: Int -> Decoding -> Bool)+#endif+#if MIN_VERSION_text(1,1,0)+ prop "Size instance" (prop_matchesShow :: Int -> Size -> Bool)+#endif
+ tests/Spec/Data/TupleSpec.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.TupleSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for tuple types.+-}+module Spec.Data.TupleSpec (main, spec) where++import Data.Orphans ()++import Instances.Data.Tuple ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 704+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Tuple" $ do+ prop "() instance"+ (prop_matchesShow :: Int -> () -> Bool)+ prop "(Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int) -> Bool)+ prop "(Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) instance"+ (prop_matchesShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+#if __GLASGOW_HASKELL__ >= 704+ prop "() generic show"+ (prop_genericShow :: Int -> () -> Bool)+ prop "(Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int) -> Bool)+ prop "(Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+ prop "(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) generic show"+ (prop_genericShow :: Int -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Bool)+#endif
+ tests/Spec/Data/Type/CoercionSpec.hs view
@@ -0,0 +1,42 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Data.Type.CoercionSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'Coercion'.+-}+module Spec.Data.Type.CoercionSpec (main, spec) where++import Instances.Data.Type.Coercion ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,7,0)+import Data.Monoid (All(..))+import Data.Type.Coercion (Coercion)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,7,0)+ describe "Text.Show.Text.Data.Type.Coercion" $+ prop "Coercion instance" (prop_matchesShow :: Int -> Coercion All Bool -> Bool)+#else+ pure ()+#endif
+ tests/Spec/Data/Type/EqualitySpec.hs view
@@ -0,0 +1,42 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeOperators #-}++{-|+Module: Spec.Data.Type.EqualitySpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for '(:~:)'.+-}+module Spec.Data.Type.EqualitySpec (main, spec) where++import Instances.Data.Type.Equality ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,7,0)+import Data.Type.Equality ((:~:))++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,7,0)+ describe "Text.Show.Text.Data.Type.Equality" $+ prop "(:~:) instance" (prop_matchesShow :: Int -> Int :~: Int -> Bool)+#else+ pure ()+#endif
+ tests/Spec/Data/TypeableSpec.hs view
@@ -0,0 +1,28 @@+{-|+Module: Spec.Data.TypeableSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Data.Typeable" module.+-}+module Spec.Data.TypeableSpec (main, spec) where++import Data.Typeable (TyCon, TypeRep)++import Instances.Data.Typeable ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Typeable" $ do+ prop "TypeRep instance" (prop_matchesShow :: Int -> TypeRep -> Bool)+ prop "TyCon instance" (prop_matchesShow :: Int -> TyCon -> Bool)
+ tests/Spec/Data/VersionSpec.hs view
@@ -0,0 +1,25 @@+module Spec.Data.VersionSpec (main, spec) where++import Data.Version (Version, showVersion)++import Instances.Data.Version ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text (fromString)+import Text.Show.Text.Data.Version (showbVersionConcrete)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Data.Version" $ do+ prop "Version instance" (prop_matchesShow :: Int -> Version -> Bool)+ prop "showbVersionConcrete output" prop_showVersion++-- | Verifies 'showVersion' and 'showbVersion' generate the same output.+prop_showVersion :: Version -> Bool+prop_showVersion v = fromString (showVersion v) == showbVersionConcrete v
+ tests/Spec/DerivedSpec.hs view
@@ -0,0 +1,119 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE TypeOperators #-}+{-|+Module: Spec.DerivedSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types that have derived 'Show' instances+(using "Text.Show.Text.TH").+-}+module Spec.DerivedSpec (main, spec) where++import Derived++import Instances.Derived ()++import Spec.Utils (prop_matchesShow)+#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_genericShow)+#endif++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Template Haskell-derived data types" $ do+ prop "Nullary instance" (prop_matchesShow :: Int -> Nullary -> Bool)+ prop "PhantomNullary Int instance" (prop_matchesShow :: Int -> PhantomNullary Int -> Bool)+ prop "MonomorphicUnary instance" (prop_matchesShow :: Int -> MonomorphicUnary -> Bool)+ prop "PolymorphicUnary Int Int instance" (prop_matchesShow :: Int -> PolymorphicUnary Int Int -> Bool)+ prop "MonomorphicProduct instance" (prop_matchesShow :: Int -> MonomorphicProduct -> Bool)+ prop "PolymorphicProduct Int Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicProduct Int Int Int Int -> Bool)+ prop "MonomorphicRecord instance" (prop_matchesShow :: Int -> MonomorphicRecord -> Bool)+ prop "PolymorphicRecord Int Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicRecord Int Int Int Int -> Bool)+ prop "MonomorphicInfix instance" (prop_matchesShow :: Int -> MonomorphicInfix -> Bool)+ prop "PolymorphicInfix Int Int Int instance" (prop_matchesShow :: Int -> PolymorphicInfix Int Int Int -> Bool)+ prop "MonomorphicForall instance" (prop_matchesShow :: Int -> MonomorphicForall -> Bool)+ prop "PolymorphicForall Int Int instance" (prop_matchesShow :: Int -> PolymorphicForall Int Int -> Bool)+ prop "AllAtOnce Int Int Int Int instance" (prop_matchesShow :: Int -> AllAtOnce Int Int Int Int -> Bool)+ prop "NormalGADT instance" (prop_matchesShow :: Int -> NormalGADT -> Bool)+ prop "ExistentialGADT Char Int Int instance" (prop_matchesShow :: Int -> ExistentialGADT Char Int Int -> Bool)+ prop "ExistentialGADT Double Double Int instance" (prop_matchesShow :: Int -> ExistentialGADT Double Double Int -> Bool)+ prop "ExistentialGADT Int String Int instance" (prop_matchesShow :: Int -> ExistentialGADT Int String Int -> Bool)+ prop "ExistentialGADT Ordering Int Int instance" (prop_matchesShow :: Int -> ExistentialGADT Ordering Int Int -> Bool)+ prop "ExistentialGADT Int Int Int instance" (prop_matchesShow :: Int -> ExistentialGADT Int Int Int -> Bool)+ prop "PrimADT# Int instance" (prop_matchesShow :: Int -> PrimADT# Int -> Bool)+ prop "LeftAssocTree Int instance" (prop_matchesShow :: Int -> LeftAssocTree Int -> Bool)+ prop "RightAssocTree Int instance" (prop_matchesShow :: Int -> RightAssocTree Int -> Bool)+ prop "Int :?: Int instance" (prop_matchesShow :: Int -> Int :?: Int -> Bool)+ prop "HigherKindedTypeParams Maybe Int instance" (prop_matchesShow :: Int -> HigherKindedTypeParams Maybe Int -> Bool)+ prop "RestrictedContext Int instance" (prop_matchesShow :: Int -> RestrictedContext Int -> Bool)+ prop "Fix Maybe instance" (prop_matchesShow :: Int -> Fix Maybe -> Bool)+#if MIN_VERSION_template_haskell(2,7,0) + prop "AllShow () () Int Int instance" (prop_matchesShow :: Int -> AllShow () () Int Int -> Bool)+ prop "AllShow Int Int Int Int instance" (prop_matchesShow :: Int -> AllShow Int Int Int Int -> Bool)+ prop "AllShow Bool Bool Int Int instance" (prop_matchesShow :: Int -> AllShow Bool Bool Int Int -> Bool)+ prop "AllShow Char Double Int Int instance" (prop_matchesShow :: Int -> AllShow Char Double Int Int -> Bool)+ prop "AllShow Float Ordering Int Int instance" (prop_matchesShow :: Int -> AllShow Float Ordering Int Int -> Bool)+ prop "NotAllShow Int Int Int Int instance" (prop_matchesShow :: Int -> NotAllShow Int Int Int Int -> Bool)+ prop "OneDataInstance Int Int Int Int instance" (prop_matchesShow :: Int -> OneDataInstance Int Int Int Int -> Bool)+ prop "AssocData1 () instance" (prop_matchesShow :: Int -> AssocData1 () -> Bool)+ prop "AssocData2 () instance" (prop_matchesShow :: Int -> AssocData2 () Int Int -> Bool)+# if __GLASGOW_HASKELL__ >= 708+ prop "NullaryData instance" (prop_matchesShow :: Int -> NullaryData -> Bool)+# endif+ prop "GADTFam Char Int Int instance" (prop_matchesShow :: Int -> GADTFam Char Int Int -> Bool)+ prop "GADTFam Double Double Int instance" (prop_matchesShow :: Int -> GADTFam Double Double Int -> Bool)+ prop "GADTFam Int String Int instance" (prop_matchesShow :: Int -> GADTFam Int String Int -> Bool)+ prop "GADTFam Ordering Int Int instance" (prop_matchesShow :: Int -> GADTFam Ordering Int Int -> Bool)+ prop "GADTFam Int Int Int instance" (prop_matchesShow :: Int -> GADTFam Int Int Int -> Bool)+#endif+#if __GLASGOW_HASKELL__ >= 702+ prop "Nullary generic show" (prop_genericShow :: Int -> Nullary -> Bool)+ prop "PhantomNullary Int generic show" (prop_genericShow :: Int -> PhantomNullary Int -> Bool)+ prop "MonomorphicUnary generic show" (prop_genericShow :: Int -> MonomorphicUnary -> Bool)+ prop "PolymorphicUnary Int Int generic show" (prop_genericShow :: Int -> PolymorphicUnary Int Int -> Bool)+ prop "MonomorphicProduct generic show" (prop_genericShow :: Int -> MonomorphicProduct -> Bool)+ prop "PolymorphicProduct Int Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicProduct Int Int Int Int -> Bool)+ prop "MonomorphicRecord generic show" (prop_genericShow :: Int -> MonomorphicRecord -> Bool)+ prop "PolymorphicRecord Int Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicRecord Int Int Int Int -> Bool)+ prop "MonomorphicInfix generic show" (prop_genericShow :: Int -> MonomorphicInfix -> Bool)+ prop "PolymorphicInfix Int Int Int generic show" (prop_genericShow :: Int -> PolymorphicInfix Int Int Int -> Bool)+-- prop "MonomorphicForall generic show" (prop_genericShow :: Int -> MonomorphicForall -> Bool)+-- prop "PolymorphicForall Int Int generic show" (prop_genericShow :: Int -> PolymorphicForall Int Int -> Bool)+-- prop "AllAtOnce Int Int Int Int generic show" (prop_genericShow :: Int -> AllAtOnce Int Int Int Int -> Bool)+ prop "NormalGADT generic show" (prop_genericShow :: Int -> NormalGADT -> Bool)+-- prop "ExistentialGADT Char Int Int generic show" (prop_genericShow :: Int -> GADT Char Int Int -> Bool)+-- prop "ExistentialGADT Double Double Int generic show" (prop_genericShow :: Int -> GADT Double Double Int -> Bool)+-- prop "ExistentialGADT Int String Int generic show" (prop_genericShow :: Int -> GADT Int String Int -> Bool)+-- prop "ExistentialGADT Ordering Int Int generic show" (prop_genericShow :: Int -> GADT Ordering Int Int -> Bool)+-- prop "ExistentialGADT Int Int Int generic show" (prop_genericShow :: Int -> GADT Int Int Int -> Bool)+ prop "LeftAssocTree Int generic show" (prop_genericShow :: Int -> LeftAssocTree Int -> Bool)+ prop "RightAssocTree Int generic show" (prop_genericShow :: Int -> RightAssocTree Int -> Bool)+ prop "Int :?: Int generic show" (prop_genericShow :: Int -> Int :?: Int -> Bool)+ prop "HigherKindedTypeParams Maybe Int generic show" (prop_genericShow :: Int -> HigherKindedTypeParams Maybe Int -> Bool)+ prop "RestrictedContext Int generic show" (prop_genericShow :: Int -> RestrictedContext Int -> Bool)+ prop "Fix Maybe generic show" (prop_genericShow :: Int -> Fix Maybe -> Bool)+# if MIN_VERSION_template_haskell(2,7,0) && __GLASGOW_HASKELL__ >= 706+ prop "AllShow () () Int Int generic show" (prop_matchesShow :: Int -> AllShow () () Int Int -> Bool)+ prop "AllShow Int Int Int Int generic show" (prop_matchesShow :: Int -> AllShow Int Int Int Int -> Bool)+ prop "AllShow Bool Bool Int Int generic show" (prop_matchesShow :: Int -> AllShow Bool Bool Int Int -> Bool)+ prop "AllShow Char Double Int Int generic show" (prop_matchesShow :: Int -> AllShow Char Double Int Int -> Bool)+ prop "AllShow Float Ordering Int Int generic show" (prop_matchesShow :: Int -> AllShow Float Ordering Int Int -> Bool)+ prop "NotAllShow Int Int Int Int generic show" (prop_genericShow :: Int -> NotAllShow Int Int Int Int -> Bool)+ prop "OneDataInstance Int Int Int Int generic show" (prop_genericShow :: Int -> OneDataInstance Int Int Int Int -> Bool)+ prop "AssocData1 () generic show" (prop_genericShow :: Int -> AssocData1 () -> Bool)+ prop "AssocData2 () generic show" (prop_genericShow :: Int -> AssocData2 () Int Int -> Bool)+# if __GLASGOW_HASKELL__ >= 708+ prop "NullaryData generic show" (prop_genericShow :: Int -> NullaryData -> Bool)+# endif+# endif+#endif
+ tests/Spec/Foreign/C/TypesSpec.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Foreign.C.TypesSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Foreign.C.Types" module.+-}+module Spec.Foreign.C.TypesSpec (main, spec) where++import Foreign.C.Types++import Instances.Foreign.C.Types ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Foreign.C.Types" $ do+ prop "CChar instance" (prop_matchesShow :: Int -> CChar -> Bool)+ prop "CSChar instance" (prop_matchesShow :: Int -> CSChar -> Bool)+ prop "CUChar instance" (prop_matchesShow :: Int -> CUChar -> Bool)+ prop "CShort instance" (prop_matchesShow :: Int -> CShort -> Bool)+ prop "CUShort instance" (prop_matchesShow :: Int -> CUShort -> Bool)+ prop "CInt instance" (prop_matchesShow :: Int -> CInt -> Bool)+ prop "CUInt instance" (prop_matchesShow :: Int -> CUInt -> Bool)+ prop "CLong instance" (prop_matchesShow :: Int -> CLong -> Bool)+ prop "CULong instance" (prop_matchesShow :: Int -> CULong -> Bool)+ prop "CPtrdiff instance" (prop_matchesShow :: Int -> CPtrdiff -> Bool)+ prop "CSize instance" (prop_matchesShow :: Int -> CSize -> Bool)+ prop "CWchar instance" (prop_matchesShow :: Int -> CWchar -> Bool)+ prop "CSigAtomic instance" (prop_matchesShow :: Int -> CSigAtomic -> Bool)+ prop "CLLong instance" (prop_matchesShow :: Int -> CLLong -> Bool)+ prop "CULLong instance" (prop_matchesShow :: Int -> CULLong -> Bool)+ prop "CIntPtr instance" (prop_matchesShow :: Int -> CIntPtr -> Bool)+ prop "CUIntPtr instance" (prop_matchesShow :: Int -> CUIntPtr -> Bool)+ prop "CIntMax instance" (prop_matchesShow :: Int -> CIntMax -> Bool)+ prop "CUIntMax instance" (prop_matchesShow :: Int -> CUIntMax -> Bool)+ prop "CClock instance" (prop_matchesShow :: Int -> CClock -> Bool)+ prop "CTime instance" (prop_matchesShow :: Int -> CTime -> Bool)+#if MIN_VERSION_base(4,4,0)+ prop "CUSeconds instance" (prop_matchesShow :: Int -> CUSeconds -> Bool)+ prop "CSUSeconds instance" (prop_matchesShow :: Int -> CSUSeconds -> Bool)+#endif+ prop "CFloat instance" (prop_matchesShow :: Int -> CFloat -> Bool)+ prop "CDouble instance" (prop_matchesShow :: Int -> CDouble -> Bool)
+ tests/Spec/Foreign/PtrSpec.hs view
@@ -0,0 +1,42 @@+{-|+Module: Spec.Foreign.PtrSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for pointer data types.+-}+module Spec.Foreign.PtrSpec (main, spec) where++import Foreign.ForeignPtr (newForeignPtr_)+import Foreign.Ptr (FunPtr, IntPtr, Ptr, WordPtr)++import Instances.Foreign.Ptr ()++import Prelude ()+import Prelude.Compat++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Property, ioProperty)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Foreign.Ptr" $ do+ prop "Ptr Int instance" (prop_matchesShow :: Int -> Ptr Int -> Bool)+ prop "FunPtr Int instance" (prop_matchesShow :: Int -> FunPtr Int -> Bool)+ prop "IntPtr instance" (prop_matchesShow :: Int -> IntPtr -> Bool)+ prop "WordPtr instance" (prop_matchesShow :: Int -> WordPtr -> Bool)+ prop "ForeignPtr instance" prop_showForeignPtr++-- | Verifies the 'Show' instance for 'ForeignPtr' is accurate.+prop_showForeignPtr :: Int -> Ptr Int -> Property+prop_showForeignPtr p ptr = ioProperty $ do+ fptr <- newForeignPtr_ ptr+ pure $ prop_matchesShow p fptr
+ tests/Spec/FromStringTextShowSpec.hs view
@@ -0,0 +1,65 @@+{-|+Module: Spec.FromStringTextShowSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'FromStringShow' and 'FromTextShow'.+-}+module Spec.FromStringTextShowSpec (main, spec) where++-- import qualified Debug.Trace as S (traceShow)++import Instances.FromStringTextShow ()++import Spec.Utils (prop_matchesShow, prop_readShow, prop_showEq)++-- import qualified System.IO as S (print)+-- import System.IO.Silently (capture_, hCapture_)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text (FromStringShow(..), FromTextShow(..))+-- import qualified Text.Show.Text as T (print)+-- import qualified Text.Show.Text.Debug.Trace as T (traceShow)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text" $ do+ prop "FromStringShow Int instance" (prop_matchesShow :: Int -> FromStringShow Int -> Bool)+ prop "FromStringShow Int: read . show = id" (prop_readShow :: Int -> FromStringShow Int -> Bool)+ prop "FromStringShow Int = Int" $ prop_showEq (FromStringShow :: Int -> FromStringShow Int)+ prop "FromStringShow String instance" (prop_matchesShow :: Int -> FromStringShow String -> Bool)+ prop "FromStringShow String: read . show = id" (prop_readShow :: Int -> FromStringShow String -> Bool)+ prop "FromStringShow String = String" $ prop_showEq (FromStringShow :: String -> FromStringShow String)+ prop "FromTextShow Int instance" (prop_matchesShow :: Int -> FromTextShow Int -> Bool)+ prop "FromTextShow Int: read . show = id" (prop_readShow :: Int -> FromTextShow Int -> Bool)+ prop "FromTextShow Int = Int" $ prop_showEq (FromTextShow :: Int -> FromTextShow Int)+ prop "FromTextShow String instance" (prop_matchesShow :: Int -> FromTextShow String -> Bool)+ prop "FromTextShow String: read . show = id" (prop_readShow :: Int -> FromTextShow String -> Bool)+ prop "FromTextShow String = String" $ prop_showEq (FromTextShow :: String -> FromTextShow String)+ -- TODO: Figure out why these fail on NixOS+-- prop "print behavior" prop_print+-- prop "traceShow behavior" prop_traceShow++-- -- | Verifies the 'print' functions for 'String' and 'TS.Text' @Show@ display+-- -- the same output.+-- prop_print :: String -> Property+-- prop_print str = ioProperty $ do+-- sRes <- capture_ $ S.print str *> hFlush stdout+-- tRes <- capture_ $ T.print str *> hFlush stdout+-- pure $ sRes == tRes++-- -- | Verifies the 'traceShow' functions for 'String' and 'TS.Text' @Show@ display+-- -- the same output.+-- prop_traceShow :: String -> Property+-- prop_traceShow str = ioProperty $ do+-- let handles = [stdout, stderr]+-- sRes <- hCapture_ handles $ S.traceShow str (pure ()) *> mapM_ hFlush handles+-- tRes <- hCapture_ handles $ T.traceShow str (pure ()) *> mapM_ hFlush handles+-- pure $ sRes == tRes
+ tests/Spec/FunctionsSpec.hs view
@@ -0,0 +1,26 @@+{-|+Module: Spec.FunctionsSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for the orphan 'Show' instance for functions.+-}+module Spec.FunctionsSpec (main, spec) where++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Functions ()+import Text.Show.Text.Functions ()++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Functions" $+ prop "Int -> Int instance" (prop_matchesShow :: Int -> (Int -> Int) -> Bool)
+ tests/Spec/GHC/Conc/WindowsSpec.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.Conc.WindowsSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'ConsoleEvent'.+-}+module Spec.GHC.Conc.WindowsSpec (main, spec) where++import Instances.GHC.Conc.Windows ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if !defined(__GHCJS__) && defined(mingw32_HOST_OS)+import GHC.Conc.Windows (ConsoleEvent)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if !defined(__GHCJS__) && defined(mingw32_HOST_OS)+ describe "Text.Show.Text.GHC.Conc.Windows" $+ prop "ConsoleEvent instance" (prop_matchesShow :: Int -> ConsoleEvent -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/EventSpec.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.EventSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "GHC.Event" module.+-}+module Spec.GHC.EventSpec (main, spec) where++import Instances.GHC.Event ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if !defined(__GHCJS__) && !defined(mingw32_HOST_OS) && MIN_VERSION_base(4,4,0)+import GHC.Event (Event)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif+++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if !defined(__GHCJS__) && !defined(mingw32_HOST_OS) && MIN_VERSION_base(4,4,0)+ describe "Text.Show.Text.GHC.Event" $ do+ prop "Event instance" (prop_matchesShow :: Int -> Event -> Bool)+-- prop "FdKey instance" (prop_matchesShow :: Int -> FdKey -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/FingerprintSpec.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.FingerprintSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Fingerprint'.+-}+module Spec.GHC.FingerprintSpec (main, spec) where++import Data.Orphans ()++import Instances.GHC.Fingerprint ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,4,0)+import GHC.Fingerprint.Type (Fingerprint)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,4,0)+ describe "Text.Show.Text.GHC.Fingerprint" $+ prop "Fingerprint instance" (prop_matchesShow :: Int -> Fingerprint -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/GenericsSpec.hs view
@@ -0,0 +1,69 @@+{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE TypeOperators #-}+#endif++{-|+Module: Spec.GHC.GenericsSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "GHC.Generics" module.+-}+module Spec.GHC.GenericsSpec (main, spec) where++import Data.Orphans ()++import Instances.GHC.Generics ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if __GLASGOW_HASKELL__ >= 702+import GHC.Generics (U1, Par1, Rec1, K1, M1, (:+:), (:*:), (:.:),+ Fixity, Associativity, Arity)++import Spec.Utils (prop_matchesShow, prop_genericShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if __GLASGOW_HASKELL__ >= 702+ describe "Text.Show.Text.GHC.Generics" $ do+ prop "Fixity instance" (prop_matchesShow :: Int -> Fixity -> Bool)+ prop "Associativity instance" (prop_matchesShow :: Int -> Associativity -> Bool)+ prop "Arity instance" (prop_matchesShow :: Int -> Arity -> Bool)+ prop "U1 Int instance" (prop_matchesShow :: Int -> U1 Int -> Bool)+ prop "Par1 Int instance" (prop_matchesShow :: Int -> Par1 Int -> Bool)+ prop "Rec1 Maybe Int instance" (prop_matchesShow :: Int -> Rec1 Maybe Int -> Bool)+ prop "K1 () Int () instance" (prop_matchesShow :: Int -> K1 () Int () -> Bool)+ prop "M1 () () Maybe Int instance" (prop_matchesShow :: Int -> M1 () () Maybe Int -> Bool)+ prop "(Maybe :+: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :+: Maybe) Int -> Bool)+ prop "(Maybe :*: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :*: Maybe) Int -> Bool)+ prop "(Maybe :.: Maybe) Int instance" (prop_matchesShow :: Int -> (Maybe :.: Maybe) Int -> Bool)+ prop "Fixity generic show" (prop_genericShow :: Int -> Fixity -> Bool)+ prop "Associativity generic show" (prop_genericShow :: Int -> Associativity -> Bool)+ prop "Arity generic show" (prop_genericShow :: Int -> Arity -> Bool)+ prop "U1 Int generic show" (prop_genericShow :: Int -> U1 Int -> Bool)+ prop "Par1 Int generic show" (prop_genericShow :: Int -> Par1 Int -> Bool)+ prop "Rec1 Maybe Int generic show" (prop_genericShow :: Int -> Rec1 Maybe Int -> Bool)+ prop "K1 () Int () generic show" (prop_genericShow :: Int -> K1 () Int () -> Bool)+ prop "M1 () () Maybe Int generic show" (prop_genericShow :: Int -> M1 () () Maybe Int -> Bool)+ prop "(Maybe :+: Maybe) Int generic show" (prop_genericShow :: Int -> (Maybe :+: Maybe) Int -> Bool)+ prop "(Maybe :*: Maybe) Int generic show" (prop_genericShow :: Int -> (Maybe :*: Maybe) Int -> Bool)+ prop "(Maybe :.: Maybe) Int generic show" (prop_genericShow :: Int -> (Maybe :.: Maybe) Int -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/RTS/FlagsSpec.hs view
@@ -0,0 +1,82 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.RTS.Flags+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'ConType'.+-}+module Spec.GHC.RTS.FlagsSpec (main, spec) where++import Instances.GHC.RTS.Flags ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,8,0)+import GHC.RTS.Flags++import Spec.Utils (ioProperty, prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Property)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,8,0)+ describe "Text.Show.Text.GHC.RTS.Flags" $ do+ prop "RTSFlags instance" prop_showRTSFlags+ prop "GCFlags instance" prop_showGCFlags+ prop "ConcFlags instance" (prop_matchesShow :: Int -> ConcFlags -> Bool)+ prop "MiscFlags instance" (prop_matchesShow :: Int -> MiscFlags -> Bool)+ prop "DebugFlags instance" (prop_matchesShow :: Int -> DebugFlags -> Bool)+ prop "CCFlags instance" prop_showCCFlags+ prop "ProfFlags instance" prop_showProfFlags+ prop "TraceFlags instance" prop_showTraceFlags+ prop "TickyFlags instance" (prop_matchesShow :: Int -> TickyFlags -> Bool)+#else+ pure ()+#endif++#if MIN_VERSION_base(4,8,0)+-- | Verifies that the 'Show' instance for 'RTSFlags' is accurate.+prop_showRTSFlags :: Int -> Property+prop_showRTSFlags p = ioProperty $ do+ rtsflags <- getRTSFlags+ pure $ prop_matchesShow p rtsflags++-- | Verifies that the 'Show' instance for 'GCFlags' is accurate.+prop_showGCFlags :: Int -> Property+prop_showGCFlags p = ioProperty $ do+ gcflags <- getGCFlags+ pure $ prop_matchesShow p gcflags++-- | Verifies that the 'Show' instance for 'CCFlags' is accurate.+prop_showCCFlags :: Int -> Property+prop_showCCFlags p = ioProperty $ do+ ccflags <- getCCFlags+ pure $ prop_matchesShow p ccflags++-- | Verifies that the 'Show' instance for 'ProfFlags' is accurate.+prop_showProfFlags :: Int -> Property+prop_showProfFlags p = ioProperty $ do+ profflags <- getProfFlags+ pure $ prop_matchesShow p profflags++-- | Verifies that the 'Show' instance for 'TraceFlags' is accurate.+prop_showTraceFlags :: Int -> Property+prop_showTraceFlags p = ioProperty $ do+ traceflags <- getTraceFlags+ pure $ prop_matchesShow p traceflags+#endif
+ tests/Spec/GHC/StaticPtrSpec.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.StaticPtrSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'StaticPtr'.+-}+module Spec.GHC.StaticPtrSpec (main, spec) where++import Instances.GHC.StaticPtr ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,8,0)+import GHC.StaticPtr (StaticPtrInfo)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,8,0)+ describe "Text.Show.Text.GHC.StaticPtr" $+ prop "StaticPtrInfo instance" (prop_matchesShow :: Int -> StaticPtrInfo -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/StatsSpec.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GHC.StatsSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'GCStats'.+-}+module Spec.GHC.StatsSpec (main, spec) where++import Instances.GHC.Stats ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,5,0)+import GHC.Stats (GCStats)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,5,0)+ describe "Text.Show.Text.GHC.Stats" $+ prop "GCStats instance" (prop_matchesShow :: Int -> GCStats -> Bool)+#else+ pure ()+#endif
+ tests/Spec/GHC/TypeLitsSpec.hs view
@@ -0,0 +1,56 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_base(4,6,0) && !(MIN_VERSION_base(4,7,0))+{-# LANGUAGE DataKinds #-}+#endif++{-|+Module: Spec.GHC.TypeLitsSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "GHC.TypeLits" module.+-}+module Spec.GHC.TypeLitsSpec (main, spec) where++import Instances.GHC.TypeLits ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if MIN_VERSION_base(4,6,0)+import GHC.TypeLits++import Spec.Utils (prop_matchesShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if MIN_VERSION_base(4,6,0)+ describe "Text.Show.Text.GHC.TypeLits" $ do+# if MIN_VERSION_base(4,7,0)+ prop "SomeNat instance" (prop_matchesShow :: Int -> SomeNat -> Bool)+ prop "SomeSymbol instance" (prop_matchesShow :: Int -> SomeSymbol -> Bool)+# else+ prop "IsEven 0 instance" (prop_matchesShow :: Int -> IsEven 0 -> Bool)+ prop "IsEven 1 instance" (prop_matchesShow :: Int -> IsEven 1 -> Bool)+ prop "IsEven 2 instance" (prop_matchesShow :: Int -> IsEven 2 -> Bool)+ prop "IsZero 0 instance" (prop_matchesShow :: Int -> IsZero 0 -> Bool)+ prop "IsZero 1 instance" (prop_matchesShow :: Int -> IsZero 1 -> Bool)+ prop "Sing 0 instance" (prop_matchesShow :: Int -> Sing 0 -> Bool)+ prop "Sing \"a\" instance" (prop_matchesShow :: Int -> Sing "a" -> Bool)+# endif+#else+ pure ()+#endif
+ tests/Spec/GenericSpec.hs view
@@ -0,0 +1,42 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.GenericSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'ConType'.+-}+module Spec.GenericSpec (main, spec) where++import Instances.Generic ()++import Prelude ()+import Prelude.Compat++import Test.Hspec (Spec, hspec, parallel)++#if __GLASGOW_HASKELL__ >= 702+import Spec.Utils (prop_matchesShow, prop_genericShow)++import Test.Hspec (describe)+import Test.Hspec.QuickCheck (prop)++import Text.Show.Text.Generic (ConType)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel $+#if __GLASGOW_HASKELL__ >= 702+ describe "Text.Show.Text.Generic" $ do+ prop "ConType instance" (prop_matchesShow :: Int -> ConType -> Bool)+ prop "ConType generic show" (prop_genericShow :: Int -> ConType -> Bool)+#else+ pure ()+#endif
+ tests/Spec/MkShowSpec.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}++#if __GLASGOW_HASKELL__ < 706+-- Template Haskell's name generation didn't name-mangle very well prior to GHC+-- 7.6 and can cause name shadowing warnings, so suppress them.+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}+#endif+{-|+Module: Spec.MkShowSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'mkShowbPrec' in "Text.Show.Text.TH".+-}+module Spec.MkShowSpec (main, spec) where++-- #if !(MIN_VERSION_base(4,8,0))+-- import Control.Applicative ((*>), pure)+-- #endif++-- import Debug.Trace (traceShow)++import Derived (AllAtOnce)+#if MIN_VERSION_template_haskell(2,7,0)+import Derived (NotAllShow(..), OneDataInstance)+#endif++import Instances.Derived ()++-- import Spec.Utils (ioProperty)++-- import System.IO (hFlush, stdout, stderr)+-- import System.IO.Silently (capture_, hCapture_)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import qualified Text.Show as S (Show)+import Text.Show.Text (Builder, FromStringShow(..), showbPrec)+-- import Text.Show.Text.Debug.Trace.TH (mkTraceShow)+import Text.Show.Text.TH (mkShowbPrec)++main :: IO ()+main = hspec spec++-- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'.+prop_mkShowbPrec :: S.Show a+ => (Int -> a -> Builder) -- ^ TH-generated 'mkShowbPrec' function+ -> Int -> a -> Bool+prop_mkShowbPrec sf p x = showbPrec p (FromStringShow x) == sf p x++-- -- | Verifies 'mkPrint' produces the same output as 'print'.+-- prop_mkPrint :: S.Show a+-- => (a -> IO ()) -- ^ TH-generated 'mkPrint' function+-- -> a -> Property+-- prop_mkPrint pf x = ioProperty $ do+-- sRes <- capture_ $ print x *> hFlush stdout+-- tRes <- capture_ $ pf x *> hFlush stdout+-- pure $ sRes == tRes+-- +-- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'.+-- prop_mkTraceShow :: S.Show a+-- => (a -> IO () -> IO ()) -- ^ TH-generated 'mkTraceShow' function+-- -> a -> Property+-- prop_mkTraceShow tsf x = ioProperty $ do+-- let handles = [stdout, stderr]+-- sRes <- hCapture_ handles $ traceShow x (pure ()) *> mapM_ hFlush handles+-- tRes <- hCapture_ handles $ tsf x (pure ()) *> mapM_ hFlush handles+-- pure $ sRes == tRes++-- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec' .+-- This uses a plain type constructor.+prop_mkShowbPrecTyCon :: Int -> AllAtOnce Int Int Int Int -> Bool+prop_mkShowbPrecTyCon = prop_mkShowbPrec $(mkShowbPrec ''AllAtOnce)++-- -- | Verifies 'mkPrint' produces the same output as 'print'.+-- -- This uses a plain type constructor.+-- prop_mkPrintTyCon :: AllAtOnce Int Int Int Int -> Property+-- prop_mkPrintTyCon = prop_mkPrint $(mkPrint ''AllAtOnce)+-- +-- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'.+-- -- This uses a plain type constructor.+-- prop_mkTraceShowTyCon :: AllAtOnce Int Int Int Int -> Property+-- prop_mkTraceShowTyCon = prop_mkTraceShow $(mkTraceShow ''AllAtOnce)++#if MIN_VERSION_template_haskell(2,7,0)+-- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'.+-- This uses a data family name.+prop_mkShowbPrecDataFam :: Int -> OneDataInstance Int Int Int Int -> Bool+prop_mkShowbPrecDataFam = prop_mkShowbPrec $(mkShowbPrec ''OneDataInstance)++-- -- | Verifies 'mkPrint' produces the same output as 'print'.+-- -- This uses a data family name.+-- prop_mkPrintDataFam :: OneDataInstance Int Int Int Int -> Property+-- prop_mkPrintDataFam = prop_mkPrint $(mkPrint ''OneDataInstance)+-- +-- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'.+-- -- This uses a data family name.+-- prop_mkTraceShowDataFam :: OneDataInstance Int Int Int Int -> Property+-- prop_mkTraceShowDataFam = prop_mkTraceShow $(mkTraceShow ''OneDataInstance)++-- | Verifies 'mkShowbPrec' produces the same output as 'showsPrec'.+-- This uses a data family instance constructor.+prop_mkShowbPrecDataFamInstCon :: Int -> NotAllShow Int Int Int Int -> Bool+prop_mkShowbPrecDataFamInstCon = prop_mkShowbPrec $(mkShowbPrec 'NASShow1)++-- -- | Verifies 'mkPrint' produces the same output as 'print'.+-- -- This uses a data family instance constructor.+-- prop_mkPrintDataFamInstCon :: NotAllShow Int Int Int Int -> Property+-- prop_mkPrintDataFamInstCon = prop_mkPrint $(mkPrint 'NASShow1)+-- +-- -- | Verifies 'mkTraceShow' produces the same output as 'traceShow'.+-- -- This uses a data family instance constructor.+-- prop_mkTraceShowDataFamInstCon :: NotAllShow Int Int Int Int -> Property+-- prop_mkTraceShowDataFamInstCon = prop_mkTraceShow $(mkTraceShow 'NASShow1)+#endif++spec :: Spec+spec = parallel . describe "mkShow and related functions" $ do+ prop "$(mkShowbPrec ''AllAtOnce) (a plain type constructor)" prop_mkShowbPrecTyCon+-- prop "$(mkPrint ''AllAtOnce) (a plain type constructor)" prop_mkPrintTyCon+-- prop "$(mkTraceShow ''AllAtOnce) (a plain type constructor)" prop_mkTraceShowTyCon+#if MIN_VERSION_template_haskell(2,7,0)+ prop "$(mkShowbPrec ''NotAllShow) (a data family instance constructor)" prop_mkShowbPrecDataFamInstCon+-- prop "$(mkPrint ''NotAllShow) (a data family instance constructor)" prop_mkPrintDataFamInstCon+-- prop "$(mkTraceShow ''NotAllShow) (a data family instance constructor)" prop_mkTraceShowDataFamInstCon+ prop "$(mkShowbPrec ''OneDataInstance) (a data family name)" prop_mkShowbPrecDataFam+-- prop "$(mkPrint ''OneDataInstance) (a data family name)" prop_mkPrintDataFam+-- prop "$(mkTraceShow ''OneDataInstance) (a data family name)" prop_mkTraceShowDataFam+#endif
+ tests/Spec/Numeric/NaturalSpec.hs view
@@ -0,0 +1,27 @@+{-|+Module: Spec.Numeric.NaturalSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for 'Natural'.+-}+module Spec.Numeric.NaturalSpec (main, spec) where++import Instances.Numeric.Natural ()++import Numeric.Natural (Natural)++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Numeric.Natural" $+ prop "Natural instance" (prop_matchesShow :: Int -> Natural -> Bool)
+ tests/Spec/System/ExitSpec.hs view
@@ -0,0 +1,27 @@+{-|+Module: Spec.System.ExitSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ test for 'ExitCode'.+-}+module Spec.System.ExitSpec (main, spec) where++import Instances.System.Exit ()++import Spec.Utils (prop_matchesShow)++import System.Exit (ExitCode)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.System.Exit" $+ prop "ExitCode instance" (prop_matchesShow :: Int -> ExitCode -> Bool)
+ tests/Spec/System/IOSpec.hs view
@@ -0,0 +1,62 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.System.IOSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "System.IO" module.+-}+module Spec.System.IOSpec (main, spec) where++#if MIN_VERSION_base(4,4,0)+import GHC.IO.Encoding.Failure (CodingFailureMode)+import GHC.IO.Encoding.Types (CodingProgress)+#endif++import Instances.System.IO ()++import Prelude ()+import Prelude.Compat++import Spec.Utils (ioProperty, prop_matchesShow)++import System.IO (BufferMode, IOMode, HandlePosn, Newline,+ NewlineMode, SeekMode, Handle, mkTextEncoding)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Property, generate, oneof)++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.System.IO" $ do+ prop "Handle instance" (prop_matchesShow :: Int -> Handle -> Bool)+ prop "IOMode instance" (prop_matchesShow :: Int -> IOMode -> Bool)+ prop "BufferMode instance" (prop_matchesShow :: Int -> BufferMode -> Bool)+ prop "HandlePosn instance" (prop_matchesShow :: Int -> HandlePosn -> Bool)+ prop "SeekMode instance" (prop_matchesShow :: Int -> SeekMode -> Bool)+ prop "TextEncoding instance" prop_showTextEncoding+#if MIN_VERSION_base(4,4,0)+ prop "CodingProgress instance" (prop_matchesShow :: Int -> CodingProgress -> Bool)+ prop "CodingFailureMode instance" (prop_matchesShow :: Int -> CodingFailureMode -> Bool)+#endif+ prop "Newline instance" (prop_matchesShow :: Int -> Newline -> Bool)+ prop "NewlineMode instance" (prop_matchesShow :: Int -> NewlineMode -> Bool)++-- | Verifies the 'Show' instance for 'TextEncoding' is accurate.+prop_showTextEncoding :: Int -> Property+prop_showTextEncoding p = ioProperty $ do+ -- Based on this description:+ -- http://hackage.haskell.org/package/base-4.7.0.2/docs/System-IO.html#v:mkTextEncoding+ utf <- generate . oneof $ map pure [ "UTF-8"+ , "UTF-16", "UTF-16BE", "UTF-16LE"+ , "UTF-32", "UTF-32BE", "UTF-32LE"+ ]+ tenc <- mkTextEncoding utf+ pure $ prop_matchesShow p tenc
+ tests/Spec/System/Posix/TypesSpec.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.System.Posix.TypesSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "System.Posix.Types" module.+-}+module Spec.System.Posix.TypesSpec (main, spec) where++import Instances.System.Posix.Types ()++import Spec.Utils (prop_matchesShow)++import System.Posix.Types++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++#include "HsBaseConfig.h"++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.System.Posix.Types" $ do+ prop "Fd instance" (prop_matchesShow :: Int -> Fd -> Bool)+#if defined(HTYPE_DEV_T)+ prop "CDev instance" (prop_matchesShow :: Int -> CDev -> Bool)+#endif+#if defined(HTYPE_INO_T)+ prop "CIno instance" (prop_matchesShow :: Int -> CIno -> Bool)+#endif+#if defined(HTYPE_MODE_T)+ prop "CMode instance" (prop_matchesShow :: Int -> CMode -> Bool)+#endif+#if defined(HTYPE_OFF_T)+ prop "COff instance" (prop_matchesShow :: Int -> COff -> Bool)+#endif+#if defined(HTYPE_PID_T)+ prop "CPid instance" (prop_matchesShow :: Int -> CPid -> Bool)+#endif+#if defined(HTYPE_SSIZE_T)+ prop "CSsize instance" (prop_matchesShow :: Int -> CSsize -> Bool)+#endif+#if defined(HTYPE_GID_T)+ prop "CGid instance" (prop_matchesShow :: Int -> CGid -> Bool)+#endif+#if defined(HTYPE_NLINK_T)+ prop "CNlink instance" (prop_matchesShow :: Int -> CNlink -> Bool)+#endif+#if defined(HTYPE_UID_T)+ prop "CUid instance" (prop_matchesShow :: Int -> CUid -> Bool)+#endif+#if defined(HTYPE_CC_T)+ prop "CCc instance" (prop_matchesShow :: Int -> CCc -> Bool)+#endif+#if defined(HTYPE_SPEED_T)+ prop "CSpeed instance" (prop_matchesShow :: Int -> CSpeed -> Bool)+#endif+#if defined(HTYPE_TCFLAG_T)+ prop "CTcflag instance" (prop_matchesShow :: Int -> CTcflag -> Bool)+#endif+#if defined(HTYPE_RLIM_T)+ prop "CRLim instance" (prop_matchesShow :: Int -> CRLim -> Bool)+#endif
+ tests/Spec/Text/ReadSpec.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE CPP #-}++{-|+Module: Spec.Text.ReadSpec+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++@hspec@ tests for data types in the "Text.Read" module.+-}+module Spec.Text.ReadSpec (main, spec) where++import Instances.Text.Read ()++import Spec.Utils (prop_matchesShow)++import Test.Hspec (Spec, describe, hspec, parallel)+import Test.Hspec.QuickCheck (prop)++import Text.Read (Lexeme)+#if MIN_VERSION_base(4,7,0)+import Text.Read.Lex (Number)+#endif++main :: IO ()+main = hspec spec++spec :: Spec+spec = parallel . describe "Text.Show.Text.Text.Read.Lex" $ do+ prop "Lexeme instance" (prop_matchesShow :: Int -> Lexeme -> Bool)+#if MIN_VERSION_base(4,7,0)+ prop "Number instance" (prop_matchesShow :: Int -> Number -> Bool)+#endif
+ tests/Spec/Utils.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-|+Module: Spec.Utils+Copyright: (C) 2014-2015 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Experimental+Portability: GHC++Testing-related utility functions.+-}+module Spec.Utils (+ ioProperty+ , prop_matchesShow+#if __GLASGOW_HASKELL__ >= 702+ , prop_genericShow+#endif+ , prop_readShow+ , prop_showEq+ ) where++#if __GLASGOW_HASKELL__ >= 702+import GHC.Generics (Generic, Rep)+import Text.Show.Text.Generic+#endif++import Prelude hiding (Show)++#if MIN_VERSION_QuickCheck(2,7,0)+import qualified Test.QuickCheck as QC (ioProperty)+#else+import Test.QuickCheck (morallyDubiousIOProperty)+#endif+import Test.QuickCheck (Property, Testable)++import qualified Text.Show as S (Show)+import qualified Text.Show.Text as T (Show)+import Text.Show.Text hiding (Show)++ioProperty :: Testable prop => IO prop -> Property+#if MIN_VERSION_QuickCheck(2,7,0)+ioProperty = QC.ioProperty+#else+ioProperty = morallyDubiousIOProperty+#endif++-- | Verifies that a type's @Show@ instances coincide for both 'String's and 'Text',+-- irrespective of precedence.+prop_matchesShow :: (S.Show a, T.Show a) => Int -> a -> Bool+prop_matchesShow p x = showbPrec p (FromStringShow x) == showbPrec p x++#if __GLASGOW_HASKELL__ >= 702+-- | Verifies that a type's @Show@ instance coincides with the output produced+-- by the equivalent 'Generic' functions.+prop_genericShow :: (T.Show a, Generic a, GShow (Rep a))+ => Int -> a -> Bool+prop_genericShow p x = showbPrec p x == genericShowbPrec p x+#endif++-- | Verifies that @read . show = id@.+prop_readShow :: (Eq a, Read a, S.Show a) => Int -> a -> Bool+prop_readShow p x = read (showsPrec p x "") == x++-- | Verifies that two type's @Show@ instances produce identical output, where the first+-- type is a wrapper around the second type.+prop_showEq :: (T.Show a, T.Show b) => (a -> b) -> Int -> a -> Bool+prop_showEq f p x = showbPrec p (f x) == showbPrec p x
text-show.cabal view
@@ -1,216 +1,316 @@-name: text-show -version: 0.7.0.1 -synopsis: Efficient conversion of values into Text -description: @text-show@ offers a replacement for the @Show@ typeclass intended - for use with @Text@ instead of @String@s. This package was created - in the spirit of - @<http://hackage.haskell.org/package/bytestring-show bytestring-show>@. - . - At the moment, @text-show@ provides @Show@ instances for most data - types in the @<http://hackage.haskell.org/package/array array>@, - @<http://hackage.haskell.org/package/base base>@, - @<http://hackage.haskell.org/package/bytestring bytestring>@, and - @<http://hackage.haskell.org/package/text text>@ packages. - Therefore, much of the source code for @text-show@ consists of - borrowed code from those packages in order to ensure that the - behaviors of the two @Show@ typeclasses coincide. - . - For most uses, simply importing "Text.Show.Text" - will suffice: - . - @ - module Main where - . - import Data.Text (Text) - import Prelude hiding (Show(..), print) - import Text.Show.Text - . - hello :: Text - hello = show (Just \"Hello, World!\") - . - main :: IO () - main = print hello - @ - . - If you desire it, there are also monomorphic versions of the @showb@ - function available in the submodules of "Text.Show.Text". A naming - convention is present in which functions that show different values - depending on the precedence end with @Prec@ (e.g., @showbIntPrec@), - whereas functions that show the same values regardless of - precedence do not end with @Prec@ (e.g., @showbBool@). - . - Support for automatically deriving @Show@ instances can be found - in the "Text.Show.Text.TH" and "Text.Show.Text.Generic" modules. - If you don't know which one to use, use @Text.Show.Text.TH@. -homepage: https://github.com/RyanGlScott/text-show -bug-reports: https://github.com/RyanGlScott/text-show/issues -license: BSD3 -license-file: LICENSE -author: Ryan Scott -maintainer: Ryan Scott <ryan.gl.scott@ku.edu> -stability: Experimental -copyright: (C) 2014-2015 Ryan Scott -category: Text -build-type: Simple -extra-source-files: CHANGELOG.md, README.md, include/*.h -cabal-version: >=1.10 - -source-repository head - type: git - location: git://github.com/RyanGlScott/text-show.git - -library - exposed-modules: Text.Show.Text - Text.Show.Text.Debug.Trace - Text.Show.Text.Debug.Trace.TH - Text.Show.Text.TH - - Text.Show.Text.Control.Applicative - Text.Show.Text.Control.Concurrent - Text.Show.Text.Control.Exception - Text.Show.Text.Control.Monad.ST - Text.Show.Text.Data.Array - Text.Show.Text.Data.Bool - Text.Show.Text.Data.ByteString - Text.Show.Text.Data.Char - Text.Show.Text.Data.Complex - Text.Show.Text.Data.Data - Text.Show.Text.Data.Dynamic - Text.Show.Text.Data.Either - Text.Show.Text.Data.Fixed - Text.Show.Text.Data.Floating - Text.Show.Text.Data.Functor.Identity - Text.Show.Text.Data.Integral - Text.Show.Text.Data.List - Text.Show.Text.Data.Maybe - Text.Show.Text.Data.Monoid - Text.Show.Text.Data.Ord - Text.Show.Text.Data.Proxy - Text.Show.Text.Data.Ratio - Text.Show.Text.Data.Text - Text.Show.Text.Data.Tuple - Text.Show.Text.Data.Typeable - Text.Show.Text.Data.Version - Text.Show.Text.Data.Void - Text.Show.Text.Foreign.C.Types - Text.Show.Text.Foreign.Ptr - Text.Show.Text.Functions - Text.Show.Text.Numeric.Natural - Text.Show.Text.System.Exit - Text.Show.Text.System.IO - Text.Show.Text.System.Posix.Types - Text.Show.Text.Text.Read - other-modules: Text.Show.Text.Classes - Text.Show.Text.Control - Text.Show.Text.Data - Text.Show.Text.Data.Typeable.Utils - Text.Show.Text.Foreign - Text.Show.Text.GHC - Text.Show.Text.Instances - Text.Show.Text.Numeric - Text.Show.Text.System - Text.Show.Text.Text - Text.Show.Text.TH.Internal - Text.Show.Text.Utils - build-depends: array >= 0.3 && < 0.6 - , base >= 4.2 && < 5 - -- , containers >= 0.1 && < 0.6 - , bytestring >= 0.9 && < 0.11 - , ghc-prim - , semigroups >= 0.16.1 && < 1 - , text >= 0.8 && < 1.3 - , template-haskell >= 2.4 && < 2.11 - hs-source-dirs: src - default-language: Haskell2010 - ghc-options: -Wall - include-dirs: include - includes: inline.h - , utils.h - install-includes: inline.h - , utils.h - - if impl(ghc >= 7.2) - exposed-modules: Text.Show.Text.Debug.Trace.Generic - Text.Show.Text.Generic - Text.Show.Text.GHC.Fingerprint - Text.Show.Text.GHC.Generics - if !os(windows) - exposed-modules: Text.Show.Text.GHC.Event - - if impl(ghc >= 7.4) - exposed-modules: Text.Show.Text.GHC.Stats - - if impl(ghc >= 7.6) - exposed-modules: Text.Show.Text.GHC.TypeLits - - if impl(ghc < 7.7) - build-depends: tagged >= 0.4.4 && < 1 - - if impl(ghc >= 7.8) - exposed-modules: Text.Show.Text.Data.Type.Coercion - Text.Show.Text.Data.Type.Equality - - if impl(ghc < 7.10) - exposed-modules: Text.Show.Text.Data.OldTypeable - else - build-depends: bytestring-builder - - if impl(ghc < 7.9) - build-depends: nats >= 0.1 && < 2 - , transformers >= 0.2.1 && < 0.5 - , void >= 0.5 && < 1 - else - build-depends: integer-gmp >= 1.0 && < 1.1 - - if impl(ghc >= 7.10) - exposed-modules: Text.Show.Text.GHC.RTS.Flags - Text.Show.Text.GHC.StaticPtr - - if os(windows) - exposed-modules: Text.Show.Text.GHC.Conc.Windows - -test-suite text-show-properties - type: exitcode-stdio-1.0 - main-is: Properties.hs - other-modules: Derived - Instances.BaseAndFriends - Instances.Derived - Instances.Utils - Properties.BaseAndFriends - Properties.Builder - Properties.Derived - Properties.MkShow - Properties.Utils - build-depends: array >= 0.3 && < 0.6 - , base >= 4.5 && < 5 - , bytestring >= 0.9 && < 0.11 - , ghc-prim - -- Needed to conditionally import Arbitrary Natural instance - , QuickCheck >= 2.5 && < 3 - , quickcheck-instances >= 0.1 && < 0.4 - -- , silently >= 1.2.4 && < 1.3 - , tasty >= 0.8 && < 0.11 - , tasty-hunit >= 0.8 && < 0.10 - , tasty-quickcheck >= 0.8 && < 0.9 - , text >= 0.8 && < 1.3 - , text-show == 0.7.0.1 - hs-source-dirs: tests - default-language: Haskell2010 - ghc-options: -Wall - include-dirs: include - includes: overlap.h - , utils.h - install-includes: overlap.h - , utils.h - - if impl(ghc < 7.7) - build-depends: tagged >= 0.4.4 && < 1 - - if impl(ghc < 7.8) - build-depends: bytestring-builder - - if impl(ghc < 7.9) - build-depends: nats >= 0.1 && < 2 - , transformers >= 0.2.1 && < 0.5 - , transformers-compat >= 0.3 && < 1 - , void >= 0.5 && < 1 +name: text-show+version: 0.8+synopsis: Efficient conversion of values into Text+description: @text-show@ offers a replacement for the @Show@ typeclass intended+ for use with @Text@ instead of @String@s. This package was created+ in the spirit of+ @<http://hackage.haskell.org/package/bytestring-show bytestring-show>@.+ .+ At the moment, @text-show@ provides @Show@ instances for most data+ types in the @<http://hackage.haskell.org/package/array array>@,+ @<http://hackage.haskell.org/package/base base>@,+ @<http://hackage.haskell.org/package/bytestring bytestring>@, and+ @<http://hackage.haskell.org/package/text text>@ packages.+ Therefore, much of the source code for @text-show@ consists of+ borrowed code from those packages in order to ensure that the+ behaviors of the two @Show@ typeclasses coincide.+ .+ For most uses, simply importing "Text.Show.Text"+ will suffice:+ .+ @+ module Main where+ .+ import Data.Text (Text)+ import Prelude hiding (Show(..), print)+ import Text.Show.Text+ .+ hello :: Text+ hello = show (Just \"Hello, World!\")+ .+ main :: IO ()+ main = print hello+ @+ .+ If you desire it, there are also monomorphic versions of the @showb@+ function available in the submodules of "Text.Show.Text". A naming+ convention is present in which functions that show different values+ depending on the precedence end with @Prec@ (e.g., @showbIntPrec@),+ whereas functions that show the same values regardless of+ precedence do not end with @Prec@ (e.g., @showbBool@).+ .+ Support for automatically deriving @Show@ instances can be found+ in the "Text.Show.Text.TH" and "Text.Show.Text.Generic" modules.+ If you don't know which one to use, use @Text.Show.Text.TH@.+homepage: https://github.com/RyanGlScott/text-show+bug-reports: https://github.com/RyanGlScott/text-show/issues+license: BSD3+license-file: LICENSE+author: Ryan Scott+maintainer: Ryan Scott <ryan.gl.scott@ku.edu>+stability: Experimental+copyright: (C) 2014-2015 Ryan Scott+category: Text+build-type: Simple+tested-with: GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1+extra-source-files: CHANGELOG.md, README.md, include/*.h+cabal-version: >=1.10++source-repository head+ type: git+ location: https://github.com/RyanGlScott/text-show++library+ exposed-modules: Text.Show.Text+ Text.Show.Text.Debug.Trace+ Text.Show.Text.Debug.Trace.TH+ Text.Show.Text.TH++ Text.Show.Text.Control.Applicative+ Text.Show.Text.Control.Concurrent+ Text.Show.Text.Control.Exception+ Text.Show.Text.Control.Monad.ST+ Text.Show.Text.Data.Array+ Text.Show.Text.Data.Bool+ Text.Show.Text.Data.ByteString+ Text.Show.Text.Data.Char+ Text.Show.Text.Data.Complex+ Text.Show.Text.Data.Data+ Text.Show.Text.Data.Dynamic+ Text.Show.Text.Data.Either+ Text.Show.Text.Data.Fixed+ Text.Show.Text.Data.Floating+ Text.Show.Text.Data.Functor.Identity+ Text.Show.Text.Data.Integral+ Text.Show.Text.Data.List+ Text.Show.Text.Data.Maybe+ Text.Show.Text.Data.Monoid+ Text.Show.Text.Data.Ord+ Text.Show.Text.Data.Proxy+ Text.Show.Text.Data.Ratio+ Text.Show.Text.Data.Text+ Text.Show.Text.Data.Tuple+ Text.Show.Text.Data.Typeable+ Text.Show.Text.Data.Version+ Text.Show.Text.Data.Void+ Text.Show.Text.Foreign.C.Types+ Text.Show.Text.Foreign.Ptr+ Text.Show.Text.Functions+ Text.Show.Text.Numeric.Natural+ Text.Show.Text.System.Exit+ Text.Show.Text.System.IO+ Text.Show.Text.System.Posix.Types+ Text.Show.Text.Text.Read++ -- Only exports functions if using Windows+ Text.Show.Text.GHC.Conc.Windows++ -- Only exports functions if base >= 4.4+ Text.Show.Text.GHC.Fingerprint+ -- Only exports functions if base >= 4.4 and not using Windows+ Text.Show.Text.GHC.Event++ -- Only exports functions if GHC >= 7.2+ Text.Show.Text.Debug.Trace.Generic+ Text.Show.Text.Generic+ Text.Show.Text.GHC.Generics++ -- Only exports functions if base >= 4.5+ Text.Show.Text.GHC.Stats++ -- Only exports functions if base >= 4.6+ Text.Show.Text.GHC.TypeLits++ -- Only exports functions if base >= 4.7+ Text.Show.Text.Data.Type.Coercion+ Text.Show.Text.Data.Type.Equality+ -- Only exports functions if base >= 4.7 && < 4.8+ Text.Show.Text.Data.OldTypeable++ -- Only exports functions if base >= 4.8+ Text.Show.Text.GHC.RTS.Flags+ Text.Show.Text.GHC.StaticPtr+ other-modules: Text.Show.Text.Classes+ Text.Show.Text.Data.Typeable.Utils+ Text.Show.Text.Instances+ Text.Show.Text.TH.Internal+ Text.Show.Text.Utils+ build-depends: array >= 0.3 && < 0.6+ , base >= 4.3 && < 5+ , base-compat >= 0.8.1 && < 1+ , bytestring >= 0.9 && < 0.11+ , bytestring-builder+ , ghc-prim+ , integer-gmp+ , nats >= 0.1 && < 2+ , semigroups >= 0.16.1 && < 1+ , tagged >= 0.4.4 && < 1+ , text >= 0.11.1 && < 1.3+ , template-haskell >= 2.5 && < 2.11+ , transformers >= 0.2.1 && < 0.5+ , void >= 0.5 && < 1+ hs-source-dirs: src+ default-language: Haskell2010+ ghc-options: -Wall+ include-dirs: include+ includes: inline.h+ , utils.h+ install-includes: inline.h+ , utils.h++test-suite text-show-spec+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ other-modules: Derived++ Instances.Derived+ Instances.FromStringTextShow+ Instances.Utils++ Instances.Control.Applicative+ Instances.Control.Concurrent+ Instances.Control.Exception+ Instances.Control.Monad.ST+ Instances.Data.ByteString+ Instances.Data.Char+ Instances.Data.Data+ Instances.Data.Dynamic+ Instances.Data.Floating+ Instances.Data.Functor.Identity+ Instances.Data.Monoid+ Instances.Data.Ord+ Instances.Data.Proxy+ Instances.Data.Text+ Instances.Data.Tuple+ Instances.Data.Typeable+ Instances.Data.Version+ Instances.Foreign.C.Types+ Instances.Foreign.Ptr+ Instances.Numeric.Natural+ Instances.System.Exit+ Instances.System.IO+ Instances.System.Posix.Types+ Instances.Text.Read++ -- Only exports functions if using Windows+ Instances.GHC.Conc.Windows++ -- Only exports functions if base >= 4.4+ Instances.GHC.Fingerprint+ -- Only exports functions if base >= 4.4 and not using Windows+ Instances.GHC.Event++ -- Only exports functions if GHC >= 7.2+ Instances.Generic+ Instances.GHC.Generics++ -- Only exports functions if base >= 4.5+ Instances.GHC.Stats++ -- Only exports functions if base >= 4.6+ Instances.GHC.TypeLits++ -- Only exports functions if base >= 4.7+ Instances.Data.Type.Coercion+ Instances.Data.Type.Equality+ -- Only exports functions if base >= 4.7 && < 4.8+ Instances.Data.OldTypeable++ -- Only exports functions if base >= 4.8+ Instances.GHC.RTS.Flags+ Instances.GHC.StaticPtr++ Spec.BuilderSpec+ Spec.DerivedSpec+ Spec.FromStringTextShowSpec+ Spec.MkShowSpec+ Spec.Utils++ Spec.Control.ApplicativeSpec+ Spec.Control.ConcurrentSpec+ Spec.Control.ExceptionSpec+ Spec.Control.Monad.STSpec+ Spec.Data.ArraySpec+ Spec.Data.BoolSpec+ Spec.Data.ByteStringSpec+ Spec.Data.CharSpec+ Spec.Data.ComplexSpec+ Spec.Data.DataSpec+ Spec.Data.DynamicSpec+ Spec.Data.EitherSpec+ Spec.Data.FixedSpec+ Spec.Data.FloatingSpec+ Spec.Data.Functor.IdentitySpec+ Spec.Data.IntegralSpec+ Spec.Data.ListSpec+ Spec.Data.MaybeSpec+ Spec.Data.MonoidSpec+ Spec.Data.OrdSpec+ Spec.Data.ProxySpec+ Spec.Data.RatioSpec+ Spec.Data.TextSpec+ Spec.Data.TupleSpec+ Spec.Data.TypeableSpec+ Spec.Data.VersionSpec+ Spec.Foreign.C.TypesSpec+ Spec.Foreign.PtrSpec+ Spec.FunctionsSpec+ Spec.Numeric.NaturalSpec+ Spec.System.ExitSpec+ Spec.System.IOSpec+ Spec.System.Posix.TypesSpec+ Spec.Text.ReadSpec++ -- Only exports functions if using Windows+ Spec.GHC.Conc.WindowsSpec++ -- Only exports functions if base >= 4.4+ Spec.GHC.FingerprintSpec+ -- Only exports functions if base >= 4.4 and not using Windows+ Spec.GHC.EventSpec++ -- Only exports functions if GHC >= 7.2+ Spec.GenericSpec+ Spec.GHC.GenericsSpec++ -- Only exports functions if base >= 4.5+ Spec.GHC.StatsSpec++ -- Only exports functions if base >= 4.6+ Spec.GHC.TypeLitsSpec++ -- Only exports functions if base >= 4.7+ Spec.Data.Type.CoercionSpec+ Spec.Data.Type.EqualitySpec+ -- Only exports functions if base >= 4.7 && < 4.8+ Spec.Data.OldTypeableSpec++ -- Only exports functions if base >= 4.8+ Spec.GHC.RTS.FlagsSpec+ Spec.GHC.StaticPtrSpec+ build-depends: array >= 0.3 && < 0.6+ , base >= 4.3 && < 5+ , base-compat >= 0.8.2 && < 1+ , base-orphans >= 0.3 && < 1+ , bytestring >= 0.9 && < 0.11+ , bytestring-builder+ , ghc-prim+ , hspec >= 2 && < 3+ , nats >= 0.1 && < 2+ , QuickCheck >= 2.5 && < 3+ , quickcheck-instances >= 0.1 && < 0.4+ -- , silently >= 1.2.4 && < 1.3+ , tagged >= 0.4.4 && < 1+ , text >= 0.11.1 && < 1.3+ , text-show == 0.8+ , transformers >= 0.2.1 && < 0.5+ , transformers-compat >= 0.3 && < 1+ , void >= 0.5 && < 1+ hs-source-dirs: tests+ default-language: Haskell2010+ ghc-options: -Wall -threaded -rtsopts+ include-dirs: include+ includes: overlap.h+ , utils.h+ install-includes: overlap.h+ , utils.h