Hello community, here is the log from the commit of package ghc-reflection for openSUSE:Factory checked in at 2020-06-19 17:17:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-reflection (Old) and /work/SRC/openSUSE:Factory/.ghc-reflection.new.3606 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-reflection" Fri Jun 19 17:17:16 2020 rev:6 rq:815157 version:2.1.6 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-reflection/ghc-reflection.changes 2019-12-27 13:56:27.608747936 +0100 +++ /work/SRC/openSUSE:Factory/.ghc-reflection.new.3606/ghc-reflection.changes 2020-06-19 17:17:18.274868155 +0200 @@ -1,0 +2,9 @@ +Tue Jun 9 09:10:57 UTC 2020 - psim...@suse.com + +- Update reflection to version 2.1.6. + # 2.1.6 [2020.05.16] + * Fix a bug in which `give` (and possibly `reify`, `reifyNat`, and + `reifySymbol`) could be unsoundly inlined by GHC 8.10 or older to produce + incorrect runtime results. + +------------------------------------------------------------------- Old: ---- reflection-2.1.5.tar.gz New: ---- reflection-2.1.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-reflection.spec ++++++ --- /var/tmp/diff_new_pack.Xvdjm2/_old 2020-06-19 17:17:19.106870511 +0200 +++ /var/tmp/diff_new_pack.Xvdjm2/_new 2020-06-19 17:17:19.110870523 +0200 @@ -1,7 +1,7 @@ # # spec file for package ghc-reflection # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %global pkg_name reflection %bcond_with tests Name: ghc-%{pkg_name} -Version: 2.1.5 +Version: 2.1.6 Release: 0 Summary: Reifies arbitrary terms into types that can be reflected back into terms License: BSD-3-Clause @@ -30,6 +30,7 @@ BuildRequires: ghc-template-haskell-devel %if %{with tests} BuildRequires: ghc-QuickCheck-devel +BuildRequires: ghc-containers-devel BuildRequires: ghc-hspec-devel %endif ++++++ reflection-2.1.5.tar.gz -> reflection-2.1.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/.travis.yml new/reflection-2.1.6/.travis.yml --- old/reflection-2.1.5/.travis.yml 2001-09-09 03:46:40.000000000 +0200 +++ new/reflection-2.1.6/.travis.yml 2001-09-09 03:46:40.000000000 +0200 @@ -2,11 +2,17 @@ # # haskell-ci '--output=.travis.yml' '--config=cabal.haskell-ci' 'cabal.project' # +# To regenerate the script (for example after adjusting tested-with) run +# +# haskell-ci regenerate +# # For more information, see https://github.com/haskell-CI/haskell-ci # -# version: 0.3.20190815 +# version: 0.10 # +version: ~> 1.0 language: c +os: linux dist: xenial git: # whether to recursively clone submodules @@ -17,11 +23,12 @@ - irc.freenode.org#haskell-lens skip_join: true template: - - "\"\\x0313reflection\\x03/\\x0306%{branch}\\x03 \\x0314%{commit}\\x03 %{build_url} %{message}\"" + - "\x0313reflection\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}" cache: directories: - $HOME/.cabal/packages - $HOME/.cabal/store + - $HOME/.hlint before_cache: - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log # remove files that are regenerated by 'cabal update' @@ -31,40 +38,51 @@ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx - rm -rfv $CABALHOME/packages/head.hackage -matrix: +jobs: include: - - compiler: ghc-8.8.1 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}} + - compiler: ghc-8.10.1 + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.10.1","cabal-install-3.2"]}} + os: linux + - compiler: ghc-8.8.3 + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.8.3","cabal-install-3.2"]}} + os: linux - compiler: ghc-8.6.5 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.6.5","cabal-install-3.2"]}} + os: linux - compiler: ghc-8.4.4 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.4.4","cabal-install-3.2"]}} + os: linux - compiler: ghc-8.2.2 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.2.2","cabal-install-3.2"]}} + os: linux - compiler: ghc-8.0.2 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.0.2","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.10.3 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.10.3","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.10.3","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.8.4 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.8.4","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.8.4","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.6.3 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.6.3","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.6.3","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.4.2 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.4.2","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.4.2","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.2.2 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.2.2","cabal-install-2.4"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.2.2","cabal-install-3.2"]}} + os: linux - compiler: ghc-7.0.4 - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.0.4","cabal-install-2.4"]}} - - compiler: ghc-head - addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-head","cabal-install-head"]}} + addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.0.4","cabal-install-3.2"]}} + os: linux allow_failures: - - compiler: ghc-head - compiler: ghc-7.0.4 - compiler: ghc-7.2.2 - - compiler: ghc-8.8.1 before_install: - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//') - WITHCOMPILER="-w $HC" + - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//') - HCPKG="$HC-pkg" - unset CC - CABAL=/opt/ghc/bin/cabal @@ -73,33 +91,11 @@ - TOP=$(pwd) - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')" - echo $HCNUMVER - - CABAL="$CABAL -vnormal+nowrap+markoutput" + - CABAL="$CABAL -vnormal+nowrap" - set -o pipefail - - | - echo 'function blue(s) { printf "\033[0;34m" s "\033[0m " }' >> .colorful.awk - echo 'BEGIN { state = "output"; }' >> .colorful.awk - echo '/^-----BEGIN CABAL OUTPUT-----$/ { state = "cabal" }' >> .colorful.awk - echo '/^-----END CABAL OUTPUT-----$/ { state = "output" }' >> .colorful.awk - echo '!/^(-----BEGIN CABAL OUTPUT-----|-----END CABAL OUTPUT-----)/ {' >> .colorful.awk - echo ' if (state == "cabal") {' >> .colorful.awk - echo ' print blue($0)' >> .colorful.awk - echo ' } else {' >> .colorful.awk - echo ' print $0' >> .colorful.awk - echo ' }' >> .colorful.awk - echo '}' >> .colorful.awk - - cat .colorful.awk - - | - color_cabal_output () { - awk -f $TOP/.colorful.awk - } - - echo text | color_cabal_output -install: - - ${CABAL} --version - - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]" - TEST=--enable-tests - BENCH=--enable-benchmarks - HEADHACKAGE=false - - if [ $HCNUMVER -ge 80800 ] ; then HEADHACKAGE=true ; fi - rm -f $CABALHOME/config - | echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config @@ -117,18 +113,13 @@ echo " prefix: $CABALHOME" >> $CABALHOME/config echo "repository hackage.haskell.org" >> $CABALHOME/config echo " url: http://hackage.haskell.org/" >> $CABALHOME/config - - | - if $HEADHACKAGE; then - echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1/g')" >> $CABALHOME/config - echo "repository head.hackage.ghc.haskell.org" >> $CABALHOME/config - echo " url: https://ghc.gitlab.haskell.org/head.hackage/" >> $CABALHOME/config - echo " secure: True" >> $CABALHOME/config - echo " root-keys: 7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d" >> $CABALHOME/config - echo " 26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329" >> $CABALHOME/config - echo " f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89" >> $CABALHOME/config - echo " key-threshold: 3" >> $CABALHOME/config - fi +install: + - ${CABAL} --version + - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]" - "echo 'jobs: 2' >> $CABALHOME/config" + - | + echo "program-default-options" >> $CABALHOME/config + echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config - cat $CABALHOME/config - rm -fv cabal.project cabal.project.local cabal.project.freeze - travis_retry ${CABAL} v2-update -v @@ -144,13 +135,13 @@ - cat cabal.project.local || true - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi - if [ -f "./examples/configure.ac" ]; then (cd "./examples" && autoreconf -i); fi - - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH} | color_cabal_output + - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH} - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'" - rm cabal.project.freeze script: - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX) # Packaging... - - ${CABAL} v2-sdist all | color_cabal_output + - ${CABAL} v2-sdist all # Unpacking... - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/ - cd ${DISTDIR} || false @@ -170,17 +161,17 @@ - cat cabal.project.local || true # Building with tests and benchmarks... # build & run tests, build benchmarks - - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output + - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all # Testing... - - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output + - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all # cabal check... - (cd ${PKGDIR_reflection} && ${CABAL} -vnormal check) - if [ $HCNUMVER -ge 71000 ] ; then (cd ${PKGDIR_reflection_examples} && ${CABAL} -vnormal check) ; fi # haddock... - - ${CABAL} v2-haddock $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output + - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all # Building without installed constraints for packages in global-db... - rm -f cabal.project.local - - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output + - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all -# REGENDATA ["--output=.travis.yml","--config=cabal.haskell-ci","cabal.project"] +# REGENDATA ("0.10",["--output=.travis.yml","--config=cabal.haskell-ci","cabal.project"]) # EOF diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/CHANGELOG.markdown new/reflection-2.1.6/CHANGELOG.markdown --- old/reflection-2.1.5/CHANGELOG.markdown 2001-09-09 03:46:40.000000000 +0200 +++ new/reflection-2.1.6/CHANGELOG.markdown 2001-09-09 03:46:40.000000000 +0200 @@ -1,3 +1,8 @@ +# 2.1.6 [2020.05.16] +* Fix a bug in which `give` (and possibly `reify`, `reifyNat`, and + `reifySymbol`) could be unsoundly inlined by GHC 8.10 or older to produce + incorrect runtime results. + # 2.1.5 [2019.08.27] * Fix a bug in which `reifyNat` would yield incorrect results for very large `Integer`s on GHC 8.2 or later. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/examples/reflection-examples.cabal new/reflection-2.1.6/examples/reflection-examples.cabal --- old/reflection-2.1.5/examples/reflection-examples.cabal 2001-09-09 03:46:40.000000000 +0200 +++ new/reflection-2.1.6/examples/reflection-examples.cabal 2001-09-09 03:46:40.000000000 +0200 @@ -20,7 +20,8 @@ , GHC == 8.2.2 , GHC == 8.4.4 , GHC == 8.6.5 - , GHC == 8.8.1 + , GHC == 8.8.3 + , GHC == 8.10.1 flag examples default: True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/fast/Data/Reflection.hs new/reflection-2.1.6/fast/Data/Reflection.hs --- old/reflection-2.1.5/fast/Data/Reflection.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/reflection-2.1.6/fast/Data/Reflection.hs 2001-09-09 03:46:40.000000000 +0200 @@ -158,6 +158,17 @@ {-# ANN module "HLint: ignore Avoid lambda" #-} #endif +-- Due to https://gitlab.haskell.org/ghc/ghc/issues/16893, inlining +-- unsafeCoerce too aggressively can cause optimization to become unsound on +-- old versions of GHC. As a workaround, we mark unsafeCoerce-using definitions +-- as NOINLINE where necessary. +-- See https://github.com/ekmett/reflection/issues/47. +#if __GLASGOW_HASKELL__ >= 811 +# define INLINE_UNSAFE_COERCE INLINE +#else +# define INLINE_UNSAFE_COERCE NOINLINE +#endif + ------------------------------------------------------------------------------ -- Reifies ------------------------------------------------------------------------------ @@ -172,7 +183,7 @@ -- | Reify a value at the type level, to be recovered with 'reflect'. reify :: forall a r. a -> (forall (s :: *). Reifies s a => Proxy s -> r) -> r reify a k = unsafeCoerce (Magic k :: Magic a r) (const a) Proxy -{-# INLINE reify #-} +{-# INLINE_UNSAFE_COERCE reify #-} #if __GLASGOW_HASKELL__ >= 707 instance KnownNat n => Reifies n Integer where @@ -215,6 +226,7 @@ (if n < 0 then throw Underflow else n) # endif Proxy +{-# INLINE_UNSAFE_COERCE reifyNat #-} -------------------------------------------------------------------------------- -- KnownSymbol @@ -233,7 +245,7 @@ -- "hello" reifySymbol :: forall r. String -> (forall (n :: Symbol). KnownSymbol n => Proxy n -> r) -> r reifySymbol n k = unsafeCoerce (MagicSymbol k :: MagicSymbol r) n Proxy - +{-# INLINE_UNSAFE_COERCE reifySymbol #-} #endif ------------------------------------------------------------------------------ @@ -256,7 +268,7 @@ -- are in scope, then the behavior is implementation defined. give :: forall a r. a -> (Given a => r) -> r give a k = unsafeCoerce (Gift k :: Gift a r) a -{-# INLINE give #-} +{-# INLINE_UNSAFE_COERCE give #-} -------------------------------------------------------------------------------- -- Explicit Numeric Reflection diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/reflection.cabal new/reflection-2.1.6/reflection.cabal --- old/reflection-2.1.5/reflection.cabal 2001-09-09 03:46:40.000000000 +0200 +++ new/reflection-2.1.6/reflection.cabal 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ name: reflection -version: 2.1.5 +version: 2.1.6 license: BSD3 license-file: LICENSE author: Edward A. Kmett, Elliott Hird, Oleg Kiselyov and Chung-chieh Shan @@ -37,7 +37,8 @@ , GHC == 8.2.2 , GHC == 8.4.4 , GHC == 8.6.5 - , GHC == 8.8.1 + , GHC == 8.8.3 + , GHC == 8.10.1 extra-source-files: examples/reflection-examples.cabal @@ -112,11 +113,13 @@ hs-source-dirs: tests main-is: Spec.hs other-modules: ReifyNatSpec + T47Spec ghc-options: -Wall default-language: Haskell98 build-tool-depends: hspec-discover:hspec-discover >= 1.8 build-depends: - base >= 2 && < 5, - hspec >= 2 && < 3, - QuickCheck >= 2 && < 3, + base >= 2 && < 5, + containers >= 0.1 && < 0.7, + hspec >= 2 && < 3, + QuickCheck >= 2 && < 3, reflection diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reflection-2.1.5/tests/T47Spec.hs new/reflection-2.1.6/tests/T47Spec.hs --- old/reflection-2.1.5/tests/T47Spec.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/reflection-2.1.6/tests/T47Spec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -0,0 +1,64 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE UndecidableInstances #-} +-- | A regression test for issue #47. +module T47Spec where + +import qualified Data.Map as M +import Data.Map (Map) +import Data.Reflection +import Test.Hspec + +main :: IO () +main = hspec spec + +spec :: Spec +spec = + describe "Given" $ do + it "should give Normal properly" $ + give Normal (toJSON (Foo Bar)) `shouldBe` + Object (M.fromList [("Foo",String "Bar")]) + it "should give ViaShow properly" $ + give ViaShow (toJSON (Foo Bar)) `shouldBe` + Object (M.fromList [("Foo",String "SHOWBAR")]) + +---------------------------------------------------------------------------- +-- Types +---------------------------------------------------------------------------- + +data Foo = Foo Bar + +instance Show Foo where + show _ = "SHOWFOO" + +data Bar = Bar | BarBar + +instance Show Bar where + show _ = "SHOWBAR" + +---------------------------------------------------------------------------- +-- ToJSON instances +---------------------------------------------------------------------------- + +instance Given Style => ToJSON Foo where + toJSON (Foo x) = Object $ M.singleton "Foo" (toJSON x) + +instance Given Style => ToJSON Bar where + toJSON x = case given of + Normal -> String $ case x of + Bar -> "Bar" + BarBar -> "BarBar" + ViaShow -> String $ show x + +data Style = Normal | ViaShow + +---------------------------------------------------------------------------- +-- Minimized aeson +---------------------------------------------------------------------------- + +class ToJSON a where + toJSON :: a -> Value + +data Value + = Object !(Map String Value) + | String !String + deriving (Eq, Show)