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
|
|
|