pinch- An alternative implementation of Thrift for Haskell.

Copyright(c) Abhinav Gupta 2015
MaintainerAbhinav Gupta <>
Safe HaskellNone



Provides the core Pinchable typeclass and the GPinchable typeclass used to derive instances automatically.



class IsTType (Tag a) => Pinchable a where Source

The Pinchable type class is implemented by types that can be sent or received over the wire as Thrift payloads.

Minimal complete definition


Associated Types

type Tag a Source

TType tag for this type.

For most custom types, this will be TStruct, TUnion, or TException. For enums, it will be TEnum. If the instance automatically derived with use of Generic, this is not required because it is automatically determined by use of Field or Enumeration.


pinch :: a -> Value (Tag a) Source

Convert an a into a Value.

For structs, struct, .=, and ?= may be used to construct Value objects tagged with TStruct.

unpinch :: Value (Tag a) -> Parser a Source

Read a Value back into an a.

For structs, .: and .:? may be used to retrieve field values.

(.=) :: Pinchable a => Int16 -> a -> FieldPair Source

Construct a FieldPair from a field identifier and a Pinchable value.

(?=) :: Pinchable a => Int16 -> Maybe a -> FieldPair Source

Construct a FieldPair from a field identifier and an optional Pinchable value.

struct :: [FieldPair] -> Value TStruct Source

Construct a Value tagged with a TStruct from the given key-value pairs. Optional fields whose values were omitted will be ignored.

struct [1 .= ("Hello" :: Text), 2 .= (42 :: Int16)]

union :: Pinchable a => Int16 -> a -> Value TUnion Source

Constructs a Value tagged with TUnion.

union 1 ("foo" :: ByteString)

type FieldPair = (Int16, Maybe SomeValue) Source

A pair of field identifier and maybe a value stored in the field. If the value is absent, the field will be ignored.

(.:) :: forall a. Pinchable a => Value TStruct -> Int16 -> Parser a Source

Given a field ID and a Value TStruct, get the value stored in the struct under that field ID. The lookup fails if the field is absent or if it's not the same type as expected by this call's context.

(.:?) :: forall a. Pinchable a => Value TStruct -> Int16 -> Parser (Maybe a) Source

Given a field ID and a Value TStruct, get the optional value stored in the struct under the given field ID. The value returned is Nothing if it was absent or the wrong type. The lookup fails only if the value retrieved fails to unpinch.

class IsTType (GTag f) => GPinchable f where Source

GPinchable is used to impelment support for automatically deriving instances of Pinchable via generics.

Associated Types

type GTag f Source

TType tag to use for objects of this type.


gPinch :: f a -> Value (GTag f) Source

Converts a generic representation of a value into a Value.

gUnpinch :: Value (GTag f) -> Parser (f a) Source

Converts a Value back into the generic representation of the object.


GPinchable (K1 i Void) 
KnownNat n => GPinchable (K1 i (Enumeration n)) 
(Pinchable a, KnownNat n) => GPinchable (K1 i (Field n (Maybe a))) 
(Pinchable a, KnownNat n) => GPinchable (K1 i (Field n a)) 

genericPinch :: (Generic a, GPinchable (Rep a)) => a -> Value (GTag (Rep a)) Source

Implementation of pinch based on GPinchable.

genericUnpinch :: (Generic a, GPinchable (Rep a)) => Value (GTag (Rep a)) -> Parser a Source

Implementation of unpinch based on GPinchable.

data Parser a Source

A simple continuation-based parser.

This is just Either e a in continuation-passing style.

runParser :: Parser a -> Either String a Source

Run a Parser and return the result inside an Either.

parserCatch :: Parser a -> (String -> Parser b) -> (a -> Parser b) -> Parser b Source

Allows handling parse errors.