Metadata revisions for stock-deepseq-0.1.0.0

Package maintainers and Hackage trustees are allowed to edit certain bits of package metadata after a release, without uploading a new tarball. Note that the tarball itself is never changed, just the metadata that is stored separately. For more information about metadata revisions, please refer to the Hackage Metadata Revisions FAQ.

No. Time User SHA256
-r10 2026-06-24T01:45:55Z BaldurBlondal 075bbf95cece2ac540390e39ac537274a8c13371cd287b6ea8a23f3932cdeedc
  • Changed tested-with from

    ghc ==9.8.1: ghc ==9.10.3: ghc ==9.12.4: ghc ==9.14.1
    to
    ghc ==9.8.1: ghc ==9.10.3: ghc ==9.12.4: ghc ==9.14.1: ghc ==9.10.3: ghc ==9.12.4: ghc ==9.14.1

  • Changed description from

    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a newtype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __@stock-deepseq@__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a newtype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __@stock-deepseq@__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r9 2026-06-24T00:21:31Z BaldurBlondal e940d5ca6fb8b27f4e36d8fc085339d2a5af027946fa6dd9da930bc4422acc39
  • Changed description from

    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a newtype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a newtype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __@stock-deepseq@__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r8 2026-06-24T00:18:10Z BaldurBlondal ab1e0aafe27ea3cc46a919fd6916eef9eefbc94161cfb1a6c63ba6e82d58ebdd
  • Changed description from

    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a newtype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r7 2026-06-24T00:17:02Z BaldurBlondal b1c503c5c5cd8cc47d3e01b8df0f812d65f27770c1baf267d826e4821c6ce402
  • Changed description from

    The /<https://hackage.haskell.org/package/stock stock>/ plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The <https://hackage.haskell.org/package/stock stock> plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r6 2026-06-24T00:16:40Z BaldurBlondal f927d45e9b82b6aff8e692c1da368486cdd1fad35f8167625efe9e4781c21324
  • Changed description from

    The /<https://hackage.haskell.org/package/stock stock>/ plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    /<https://hackage.haskell.org/package/stock-deepseq stock>/ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The /<https://hackage.haskell.org/package/stock stock>/ plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    <https://hackage.haskell.org/package/stock stock> companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r5 2026-06-24T00:12:38Z BaldurBlondal 38cdc42d2cabccd1ef74b9d5d3c8cac64abbb41c39660904a2b04ac6b1a8fbcb
  • Changed description from

    The /@<https://hackage.haskell.org/package/stock stock>@/ plugin
    provides a datatype
    _@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@_ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The /<https://hackage.haskell.org/package/stock stock>/ plugin
    provides a datatype
    __@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@__ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    /<https://hackage.haskell.org/package/stock-deepseq stock>/ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r4 2026-06-24T00:11:05Z BaldurBlondal b672b8c9ba68f3eedde18d52171ed0403bdd8576870a0d337a8e174e2cba49bf
  • Changed description from

    The @<https://hackage.haskell.org/package/stock stock>@_ plugin
    provides a datatype for deriving and synthesising instances at
    compile time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The /@<https://hackage.haskell.org/package/stock stock>@/ plugin
    provides a datatype
    _@<https://hackage-content.haskell.org/package/stock-0.1.0.0/docs/Stock.html#t:Stock Stock>@_ 
    for deriving and synthesising instances at compile
    time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r3 2026-06-24T00:09:37Z BaldurBlondal 5e2cd9b5ace9b5310b8ea705843ef2f6c7a454d0c6d274e0117a56e5af835a07
  • Changed description from

    The @<https://hackage.haskell.org/package/stock stock>@ plugin
    provides a datatype for deriving and synthesising instances at
    compile time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * @<https://hackage.haskell.org/package/stock-hashable stock-hashable>@: @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * @<https://hackage.haskell.org/package/stock-aeson stock-aeson>@: @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * @<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@: @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * @<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@: @<https://hackage.haskell.org/package/profunctors/docs/Data-Profunctor.html#t:Profunctor Profunctor>@
    to
    The @<https://hackage.haskell.org/package/stock stock>@_ plugin
    provides a datatype for deriving and synthesising instances at
    compile time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage-content.haskell.org/package/deepseq-1.5.2.0/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * __@<https://hackage.haskell.org/package/stock-hashable stock-hashable>@__: @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage-content.haskell.org/package/hashable-1.5.1.0/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * __@<https://hackage.haskell.org/package/stock-aeson stock-aeson>@__: @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage-content.haskell.org/package/aeson-2.3.0.0/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * __@<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@__: @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage-content.haskell.org/package/QuickCheck-2.18.0.0/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * __@<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@__: @<https://hackage-content.haskell.org/package/profunctors-5.6.3/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r2 2026-06-23T19:56:41Z BaldurBlondal 381da668a6791f9df0a1dc56389db0c853193be345de5ac85ce646ee8dcdf32d
  • Changed description from

    The <https://hackage.haskell.org/package/stock stock> plugin provides a datatype for deriving and synthesising
    instances at compile time. @stock-deepseq@ extends the <https://hackage.haskell.org/package/stock stock> with
    support for @NFData@ and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock -Wno-unused-top-binds #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > import Stock.Override
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    @stock-deepseq@ provides three instances, that signal to the
    plugin how to derive @NFData@, @NFData1@, @NFData2@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    to
    The @<https://hackage.haskell.org/package/stock stock>@ plugin
    provides a datatype for deriving and synthesising instances at
    compile time. __stock-deepseq__ extends it to support
    @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@ 
    and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    __stock-deepseq__ provides three instances, that signal to the
    plugin how to derive @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    
    @<https://hackage.haskell.org/package/stock-deepseq stock>@ companion packages include:
    
    * __stock-deepseq__: @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData NFData>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData1 NFData1>@, @<https://hackage.haskell.org/package/deepseq/docs/Control-DeepSeq.html#t:NFData2 NFData2>@
    * @<https://hackage.haskell.org/package/stock-hashable stock-hashable>@: @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable.html#t:Hashable Hashable>@, @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable-Lifted.html#t:Hashable1 Hashable1>@, @<https://hackage.haskell.org/package/hashable/docs/Data-Hashable-Lifted.html#t:Hashable2 Hashable2>@
    * @<https://hackage.haskell.org/package/stock-aeson stock-aeson>@: @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON ToJSON>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON1 ToJSON1>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:ToJSON2 ToJSON2>@; @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON FromJSON>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON1 FromJSON1>@, @<https://hackage.haskell.org/package/aeson/docs/Data-Aeson.html#t:FromJSON2 FromJSON2>@
    * @<https://hackage.haskell.org/package/stock-quickcheck stock-quickcheck>@: @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary Arbitrary>@, @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary1 Arbitrary1>@, @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:Arbitrary2 Arbitrary2>@; @<https://hackage.haskell.org/package/QuickCheck/docs/Test-QuickCheck.html#t:CoArbitrary CoArbitrary>@
    * @<https://hackage.haskell.org/package/stock-profunctors stock-profunctors>@: @<https://hackage.haskell.org/package/profunctors/docs/Data-Profunctor.html#t:Profunctor Profunctor>@

-r1 2026-06-23T15:54:46Z BaldurBlondal a9f841c4e8bb86e032432af4f6ae72a09a3083a2b31b6539b1e6cea2e0e74987
  • Changed description from

    The @stock@ plugin provides a datatype for deriving and synthesising
    instances at compile time. @stock-deepseq@ extends the @stock@ with
    support for @NFData@ and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock -Wno-unused-top-binds #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > import Stock.Override
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    @stock-deepseq@ provides three instances, that signal to the
    plugin how to derive @NFData@, @NFData1@, @NFData2@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..
    to
    The <https://hackage.haskell.org/package/stock stock> plugin provides a datatype for deriving and synthesising
    instances at compile time. @stock-deepseq@ extends the <https://hackage.haskell.org/package/stock stock> with
    support for @NFData@ and higher-kinded variants.
    
    > {-# options_ghc -fplugin Stock -Wno-unused-top-binds #-}
    > 
    > {-# language DerivingVia #-}
    > {-# language DataKinds   #-}
    >
    > import Stock
    > import Stock.NFData
    > import Stock.Override
    > 
    > import Control.Exception
    > 
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Stock Person
    > 
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Left stack overflow
    > -- >> geir == geir
    > -- <loop>
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = P {name = "Geir", .. } }
    > geir :: Person
    > geir = P { name = "Geir", age = 10, secret = geir }
    
    The @rnf@ function triggers the loop, but by pinning @secret@ as an
    ignored field, we can happily force the other fields.
    
    > newtype Ignore a = Ignore a
    > instance NFData (Ignore a) where rnf _ = ()
    > instance Eq     (Ignore a) where _ == _ = True
    > instance Ord    (Ignore a) where compare _ _ = EQ
    > instance Show   (Ignore a) where show _ = "<ignored>"
    >
    > data Person = P { name :: String, age :: Int, secret :: Person }
    >   deriving (Eq, Ord, Show, NFData) via 
    >     Overriding Person '[ secret via Ignore ]
    >
    > -- >> try @SomeException (evaluate (rnf geir))
    > -- Right ()
    > -- >> geir == geir
    > -- True
    > -- >> geir
    > -- P {name = "Geir", age = 10, secret = <ignored>}
    
    @stock-deepseq@ provides three instances, that signal to the
    plugin how to derive @NFData@, @NFData1@, @NFData2@.
    
    > instance DeriveStock  NFData  ..
    > instance DeriveStock1 NFData1 ..
    > instance DeriveStock2 NFData2 ..

-r0 2026-06-23T15:43:48Z BaldurBlondal e7803f03c3709ccd13f59ecee50dbe9de0571eab74619819f20ad0be8e560edc