scale-1.0.0.0: SCALE v2.0 codec for Haskell Web3 library.
CopyrightAleksandr Krupenkin 2016-2021
LicenseApache-2.0
Maintainermail@akru.me
Stabilityexperimental
Portabilityunportable
Safe HaskellNone
LanguageHaskell2010

Codec.Scale

Description

The SCALE (Simple Concatenated Aggregate Little-Endian) Codec is a lightweight, efficient, binary serialization and deserialization codec.

It is designed for high-performance, copy-free encoding and decoding of data in resource-constrained execution contexts, like the Substrate runtime. It is not self-describing in any way and assumes the decoding context has all type knowledge about the encoded data.

Synopsis

Documentation

encode :: (Encode a, ByteArray ba) => a -> ba Source #

Encode datatype to SCALE format.

decode :: (ByteArrayAccess ba, Decode a) => ba -> Either String a Source #

Decode datatype from SCALE format.

encode' :: (Generic a, Rep a ~ rep, GEncode rep, ByteArray ba) => a -> ba Source #

Generic driven version of encode

decode' :: (Generic a, Rep a ~ rep, GDecode rep, ByteArrayAccess ba) => ba -> Either String a Source #

Generic driven version of decode

class Encode a Source #

A class for encoding datatypes to SCALE format.

If your compiler has support for the DeriveGeneric and DefaultSignatures language extensions (ghc >= 7.2.1), the put method will have default generic implementations.

To use this option, simply add a deriving Generic clause to your datatype and declare a Encode instance for it without giving a definition for put.

Instances

Instances details
Encode Bool Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Bool Source #

Encode Int8 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Int8 Source #

Encode Int16 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Int16 Source #

Encode Int32 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Int32 Source #

Encode Int64 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Int64 Source #

Encode Word8 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Word8 Source #

Encode Word16 Source # 
Instance details

Defined in Codec.Scale.Core

Encode Word32 Source # 
Instance details

Defined in Codec.Scale.Core

Encode Word64 Source # 
Instance details

Defined in Codec.Scale.Core

Encode () Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter () Source #

Encode ByteString Source # 
Instance details

Defined in Codec.Scale.Core

Encode Text Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter Text Source #

Encode a => Encode [a] Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter [a] Source #

Encode (Maybe Bool) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (Maybe Bool) Source #

Encode a => Encode (Maybe a) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (Maybe a) Source #

(Encode a, Unbox a) => Encode (Vector a) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (Vector a) Source #

Encode (Vector Bit) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (Vector Bit) Source #

Integral a => Encode (Compact a) Source # 
Instance details

Defined in Codec.Scale.Compact

Methods

put :: Putter (Compact a) Source #

Encode a => Encode (SingletonEnum a) Source # 
Instance details

Defined in Codec.Scale.SingletonEnum

Encode (Skip a) Source # 
Instance details

Defined in Codec.Scale.Skip

Methods

put :: Putter (Skip a) Source #

(Encode a, Encode b) => Encode (Either a b) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (Either a b) Source #

(Encode a1, Encode a2) => Encode (a1, a2) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2) Source #

(Encode a1, Encode a2, Encode a3) => Encode (a1, a2, a3) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3) Source #

(Encode a1, Encode a2, Encode a3, Encode a4) => Encode (a1, a2, a3, a4) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5) => Encode (a1, a2, a3, a4, a5) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6) => Encode (a1, a2, a3, a4, a5, a6) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7) => Encode (a1, a2, a3, a4, a5, a6, a7) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8) => Encode (a1, a2, a3, a4, a5, a6, a7, a8) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15, Encode a16) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15, Encode a16, Encode a17) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15, Encode a16, Encode a17, Encode a18) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15, Encode a16, Encode a17, Encode a18, Encode a19) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) Source #

(Encode a1, Encode a2, Encode a3, Encode a4, Encode a5, Encode a6, Encode a7, Encode a8, Encode a9, Encode a10, Encode a11, Encode a12, Encode a13, Encode a14, Encode a15, Encode a16, Encode a17, Encode a18, Encode a19, Encode a20) => Encode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

put :: Putter (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) Source #

class Decode a Source #

A class for decoding datatypes from SCALE format.

If your compiler has support for the DeriveGeneric and DefaultSignatures language extensions (ghc >= 7.2.1), the get method will have default generic implementations.

To use this option, simply add a deriving Generic clause to your datatype and declare a Decode instance for it without giving a definition for get.

Instances

Instances details
Decode Bool Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Bool Source #

Decode Int8 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Int8 Source #

Decode Int16 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Int16 Source #

Decode Int32 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Int32 Source #

Decode Int64 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Int64 Source #

Decode Word8 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Word8 Source #

Decode Word16 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Word16 Source #

Decode Word32 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Word32 Source #

Decode Word64 Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Word64 Source #

Decode () Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get () Source #

Decode ByteString Source # 
Instance details

Defined in Codec.Scale.Core

Decode Text Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get Text Source #

Decode a => Decode [a] Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get [a] Source #

Decode (Maybe Bool) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (Maybe Bool) Source #

Decode a => Decode (Maybe a) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (Maybe a) Source #

(Decode a, Unbox a) => Decode (Vector a) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (Vector a) Source #

Decode (Vector Bit) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (Vector Bit) Source #

Integral a => Decode (Compact a) Source # 
Instance details

Defined in Codec.Scale.Compact

Methods

get :: Get (Compact a) Source #

Decode a => Decode (SingletonEnum a) Source # 
Instance details

Defined in Codec.Scale.SingletonEnum

Methods

get :: Get (SingletonEnum a) Source #

Default a => Decode (Skip a) Source # 
Instance details

Defined in Codec.Scale.Skip

Methods

get :: Get (Skip a) Source #

(Decode a, Decode b) => Decode (Either a b) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (Either a b) Source #

(Decode a1, Decode a2) => Decode (a1, a2) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2) Source #

(Decode a1, Decode a2, Decode a3) => Decode (a1, a2, a3) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3) Source #

(Decode a1, Decode a2, Decode a3, Decode a4) => Decode (a1, a2, a3, a4) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5) => Decode (a1, a2, a3, a4, a5) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6) => Decode (a1, a2, a3, a4, a5, a6) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7) => Decode (a1, a2, a3, a4, a5, a6, a7) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8) => Decode (a1, a2, a3, a4, a5, a6, a7, a8) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15, Decode a16) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15, Decode a16, Decode a17) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15, Decode a16, Decode a17, Decode a18) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15, Decode a16, Decode a17, Decode a18, Decode a19) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) Source #

(Decode a1, Decode a2, Decode a3, Decode a4, Decode a5, Decode a6, Decode a7, Decode a8, Decode a9, Decode a10, Decode a11, Decode a12, Decode a13, Decode a14, Decode a15, Decode a16, Decode a17, Decode a18, Decode a19, Decode a20) => Decode (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) Source # 
Instance details

Defined in Codec.Scale.Core

Methods

get :: Get (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) Source #

class All (SListI :: [Type] -> Constraint) (Code a) => Generic a #

The class of representable datatypes.

The SOP approach to generic programming is based on viewing datatypes as a representation (Rep) built from the sum of products of its components. The components of a datatype are specified using the Code type family.

The isomorphism between the original Haskell datatype and its representation is witnessed by the methods of this class, from and to. So for instances of this class, the following laws should (in general) hold:

to . from === id :: a -> a
from . to === id :: Rep a -> Rep a

You typically don't define instances of this class by hand, but rather derive the class instance automatically.

Option 1: Derive via the built-in GHC-generics. For this, you need to use the DeriveGeneric extension to first derive an instance of the Generic class from module GHC.Generics. With this, you can then give an empty instance for Generic, and the default definitions will just work. The pattern looks as follows:

import qualified GHC.Generics as GHC
import Generics.SOP

...

data T = ... deriving (GHC.Generic, ...)

instance Generic T -- empty
instance HasDatatypeInfo T -- empty, if you want/need metadata

Option 2: Derive via Template Haskell. For this, you need to enable the TemplateHaskell extension. You can then use deriveGeneric from module Generics.SOP.TH to have the instance generated for you. The pattern looks as follows:

import Generics.SOP
import Generics.SOP.TH

...

data T = ...

deriveGeneric ''T -- derives HasDatatypeInfo as well

Tradeoffs: Whether to use Option 1 or 2 is mainly a matter of personal taste. The version based on Template Haskell probably has less run-time overhead.

Non-standard instances: It is possible to give Generic instances manually that deviate from the standard scheme, as long as at least

to . from === id :: a -> a

still holds.