on master help sign in
9 files changed+66−16
since splitsnapshots
unifiedsplit
.github/workflows/ci.yaml+2 .vscode/extensions.json+11 .vscode/settings.json+5−4 CHANGELOG.md+4 bin/test+1−1 flake.lock+18−1 flake.nix+11−4 shell.nix+1 src/JRec/Internal.hs+13−6
.github/workflows/ci.yaml+2
@@ -13,3 +13,5 @@ jobs:
1313 experimental-features = nix-command flakes
1414 - name: Build and test 🔧
1515 run: nix build -j 4 -L
16+ - name: Build and test (GHC 8.8) 🔧
17+ run: nix build -j 4 -L .#jrec-ghc88
.vscode/extensions.jsonnew file+11
@@ -0,0 +1,11 @@
1+{
2+ // See https://go.microsoft.com/fwlink/?LinkId=827846
3+ // for the documentation about the extensions.json format
4+ "recommendations": [
5+ "haskell.haskell",
6+ "arrterian.nix-env-selector",
7+ "bbenoist.nix",
8+ "jnoortheen.nix-ide",
9+ "tamasfe.even-better-toml"
10+ ]
11+}
.vscode/settings.json+5−4
@@ -1,5 +1,6 @@
11{
2− "nixEnvSelector.nixShellConfig": "${workspaceRoot}/default.nix",
3− "editor.formatOnType": true,
4− "editor.formatOnSave": true
5−}
2+ "editor.formatOnType": true,
3+ "editor.formatOnSave": true,
4+ "nixEnvSelector.nixFile": "${workspaceRoot}/shell.nix",
5+ "haskell.manageHLS": "PATH"
6+}
CHANGELOG.md+4
@@ -1,5 +1,9 @@
11# Revision history for rec
22
3+## Unreleased
4+
5+- GHC 9.2 + Aeson 2.0 support
6+
37## 0.1.0.0 -- YYYY-mm-dd
48
59* First version. Released on an unsuspecting world.
bin/test+1−1
@@ -2,4 +2,4 @@
22set -xe
33
44# NOTE: ghcid should be run with -W to allow warnings from should-not-typecheck
5−nix-shell --pure --run "ghcid $* -W -c 'cabal new-repl test:jrec-test' -T \":main $*\""
5+nix develop -c sh -c "ghcid $* -W -c 'cabal new-repl test:jrec-test' -T \":main $*\""
flake.lock+18−1
@@ -34,6 +34,22 @@
3434 "type": "github"
3535 }
3636 },
37+ "nixpkgs-ghc88": {
38+ "locked": {
39+ "lastModified": 1596466290,
40+ "narHash": "sha256-V1vrlYfVEdW4iauUc58LCtorSxLLF+X/PhjD5+dQjeQ=",
41+ "owner": "nixos",
42+ "repo": "nixpkgs",
43+ "rev": "76f2e271a2ef9de3734dcc9d366a42d6bfb18e82",
44+ "type": "github"
45+ },
46+ "original": {
47+ "owner": "nixos",
48+ "ref": "76f2e271a2ef",
49+ "repo": "nixpkgs",
50+ "type": "github"
51+ }
52+ },
3753 "nixpkgs-lib": {
3854 "locked": {
3955 "dir": "lib",
@@ -55,7 +71,8 @@
5571 "root": {
5672 "inputs": {
5773 "flake-parts": "flake-parts",
58− "nixpkgs": "nixpkgs"
74+ "nixpkgs": "nixpkgs",
75+ "nixpkgs-ghc88": "nixpkgs-ghc88"
5976 }
6077 }
6178 },
flake.nix+11−4
@@ -1,6 +1,7 @@
11{
22 inputs = {
33 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4+ nixpkgs-ghc88.url = "github:nixos/nixpkgs/76f2e271a2ef";
45 flake-parts.url = "github:hercules-ci/flake-parts";
56 };
67 outputs = inputs@{ nixpkgs, flake-parts, ... }:
@@ -11,17 +12,23 @@
1112 overlay = self: super: {
1213 jrec = self.callCabal2nix "jrec" ./. { };
1314 };
14− haskellPackages' = pkgs.haskellPackages.extend overlay;
15+ ghcVersions = {
16+ ghc88 = inputs.nixpkgs-ghc88.legacyPackages.${system}.haskellPackages.extend overlay;
17+ ghc92 = pkgs.haskellPackages.extend overlay;
18+ };
1519 in
1620 {
17− packages.default = haskellPackages'.jrec;
18− devShells.default = haskellPackages'.shellFor {
21+ packages.default = ghcVersions.ghc92.jrec;
22+ devShells.default = ghcVersions.ghc92.shellFor {
1923 packages = p: [ p.jrec ];
20− buildInputs = with haskellPackages'; [
24+ buildInputs = with ghcVersions.ghc92; [
2125 cabal-install
26+ ghcid
2227 haskell-language-server
2328 ];
2429 };
30+ # Expose jrec built with GHC 8.8 so it can be tested in CI.
31+ packages.jrec-ghc88 = ghcVersions.ghc88.jrec;
2532 };
2633 };
2734}
shell.nixnew file+1
@@ -0,0 +1 @@
1+(builtins.getFlake ("git+file://" + toString ./.)).devShells.${builtins.currentSystem}.default
src/JRec/Internal.hs+13−6
@@ -46,7 +46,14 @@ import GHC.TypeLits
4646import qualified Optics.Lens as OL
4747import Unsafe.Coerce
4848import Prelude
49−import qualified Data.Aeson.Key as Key
49+#if MIN_VERSION_aeson(2,0,0)
50+import Data.Aeson.Key (fromText, fromString)
51+#else
52+fromText :: a -> a
53+fromText = id
54+fromString :: String -> T.Text
55+fromString = T.pack
56+#endif
5057
5158-- | Field named @l@ labels value of type @t@ adapted from the awesome /labels/ package.
5259-- Example: @(#name := \"Chris\") :: (\"name\" := String)@
@@ -559,16 +566,16 @@ class ToJSON a => EncodeField a where
559566
560567instance ToJSON a => EncodeField a where
561568 encodeField = pure . toJSON
562− encodeKV k v = Key.fromText k .= v
569+ encodeKV k v = fromText k .= v
563570
564571instance {-# OVERLAPS #-} ToJSON a => EncodeField (Maybe a) where
565572 encodeField = fmap toJSON
566573 encodeKV _ Nothing = mempty
567− encodeKV k v = Key.fromText k .= v
574+ encodeKV k v = fromText k .= v
568575
569576recToValue :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Value
570577recToValue options r =
571− object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (Key.fromString (fieldTransform options k),) <$> encodeField v) r
578+ object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (fromString (fieldTransform options k),) <$> encodeField v) r
572579
573580recToEncoding :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Encoding
574581recToEncoding options r =
@@ -673,10 +680,10 @@ class FromJSON a => ParseField a where
673680 parseField :: Object -> T.Text -> Parser a
674681
675682instance FromJSON a => ParseField a where
676− parseField o k = o .: Key.fromText k
683+ parseField o k = o .: fromText k
677684
678685instance {-# OVERLAPS #-} FromJSON a => ParseField (Maybe a) where
679− parseField o k = o .:? Key.fromText k
686+ parseField o k = o .:? fromText k
680687
681688instance
682689 ( KnownSymbol l,