[Haskell-cafe] AMQP framing layer: design help requested.

Paul Johnson paul at cogito.org.uk
Sat Mar 22 12:08:23 EDT 2008

Dean Herington wrote:
> At 6:41 PM -0700 3/21/08, Adam Langley wrote:
>> Also
>>>    getter <- fmap (amqpGetTable !)  getWord8
>>>    getter
>> is just
>>  > fmap (amqpGetTable !)  getWord8
> I don't think so.  Aren't there two "gettings": the first to get the 
> "type" byte and the second to get the item?
Yes.  I didn't use it because it seemed obfuscated, but in fact the
point-free version is

>  fmap (amqpGetTable !) getWord8 >>= id

And I've also got an AmqpWire class similar to Dean's AmqpValue class.
But both of these miss the point (which is why I didn't clutter up my
simplified explanation with them).

I'm looking for an alternative to the honking big AmqpVariant and
AmqpArray types.  I think I want something along the lines of:

> class (Binary v) => VariantClass v where
>     typeCode :: v -> Word8
>    fromVariant :: AmqpVariant -> Maybe v
> newtype AmqpVariant = forall a . (VariantClass a) => Variant a
> newtype AmqpArray = forall a . (VariantClass a) => AmqpArray [a]

But I can't see how to write "fromVariant".  I'm also unsure what the
"amqpGet" and "amqpPut" methods might look like.

Or maybe these two types are actually the best design.  They do let you
pattern-match on the contents.  Extracting the contents of a variant
from the design above would be something like:

> processVariant (Variant v) =
>    case typeCode v of
>       0x01 -> processWord8 $ fromJust $ fromVariant v
>       0x02 -> ... and so on.

Compare this with:

> processVariant (VariantWord8 v) = processWord8 v
> processVariant (VariantWord16 v) = processWord16 v
>  ... and so on.

What do you think?


More information about the Haskell-Cafe mailing list