Consider deriving e.g. FromJSON via Generically or CustomJSON from deriving-aeson (see fumieval/deriving-aeson#16 for the upstream issue). This is currently very slow for large-ish types, e.g.
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
import Data.Aeson
import GHC.Generics (Generic (..))
-- 30 empty constructors
data X = X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 | X25 | X26 | X27 | X28 | X29 | X30
deriving stock (Generic)
deriving (FromJSON) via Genericallyish X
newtype Genericallyish a = Genericallyish a
instance (Generic a, GFromJSON Zero (Rep a)) => FromJSON (Genericallyish a) where
parseJSON value = Genericallyish <$> genericParseJSON defaultOptions value
takes ~22s to compile on my machine using 8.10 and 9.2, and still 10s on 9.6.
But bisection reveals that before #846, this snippet actually compiled very fast, in only 2s on my machine with GHC 8.10! The main reason seems to be that much less code is generated, which is the exact opposite of what #846 was about in the first place. Maybe there is a minimal subset that can be reverted? 🤔
Consider deriving e.g.
FromJSONviaGenericallyorCustomJSONfromderiving-aeson(see fumieval/deriving-aeson#16 for the upstream issue). This is currently very slow for large-ish types, e.g.{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} import Data.Aeson import GHC.Generics (Generic (..)) -- 30 empty constructors data X = X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 | X25 | X26 | X27 | X28 | X29 | X30 deriving stock (Generic) deriving (FromJSON) via Genericallyish X newtype Genericallyish a = Genericallyish a instance (Generic a, GFromJSON Zero (Rep a)) => FromJSON (Genericallyish a) where parseJSON value = Genericallyish <$> genericParseJSON defaultOptions valuetakes ~22s to compile on my machine using 8.10 and 9.2, and still 10s on 9.6.
But bisection reveals that before #846, this snippet actually compiled very fast, in only 2s on my machine with GHC 8.10! The main reason seems to be that much less code is generated, which is the exact opposite of what #846 was about in the first place. Maybe there is a minimal subset that can be reverted? 🤔