Type classes for PostgreSQL type mappings.
Core type classes and algebra extracted from the postgresql-types library.
Defines the fundamental abstractions for mapping Haskell types to PostgreSQL types, including binary and textual encoding/decoding, type metadata, and error handling.
This package provides the type class algebra without concrete type implementations, making it suitable as a lightweight dependency for libraries that want to define their own PostgreSQL type mappings or work with the postgresql-types ecosystem.
postgresql-types-algebra
Core type classes and algebra for PostgreSQL type mappings, extracted from "postgresql-types".
Overview
This package provides the fundamental abstractions for mapping Haskell types to PostgreSQL types:
- Type classes defining the algebra for PostgreSQL type mappings
- Error types for decoding failures
- Metadata support for type names, OIDs, and parameters
- No concrete implementations - just the algebra
Type Classes
IsScalar
The core type class for types that map to PostgreSQL values:
class IsScalar a where
-- Type metadata
typeName :: Tagged a Text
baseOid :: Tagged a (Maybe Word32)
arrayOid :: Tagged a (Maybe Word32)
typeParams :: Tagged a [Text]
typeSignature :: Tagged a Text
-- Binary format
binaryEncoder :: a -> Write.Write
binaryDecoder :: PtrPeeker.Variable (Either DecodingError a)
-- Textual format
textualEncoder :: a -> TextBuilder.TextBuilder
textualDecoder :: Attoparsec.Parser a
This class enables:
- Binary encoding/decoding using PostgreSQL's native binary format
- Textual encoding/decoding using PostgreSQL's text representation
- Type metadata including OIDs and type signatures for parameterized types
- Round-trip fidelity through all encoding combinations
Use Cases
For Library Authors
Use this package to:
- Define custom PostgreSQL type mappings compatible with the "postgresql-types" ecosystem
- Create adapter libraries for different PostgreSQL client libraries
- Build generic tools that work with any
IsScalarinstance
For Application Developers
This package is typically used indirectly through:
- "postgresql-types" - Concrete type implementations
- "hasql-postgresql-types" - "hasql" integration
- "postgresql-simple-postgresql-types" - "postgresql-simple" integration.