Haskell Thrift Bindings

License
=======

Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.

Compile
=======

Use Cabal to compile and install; ./configure uses Cabal underneath, and that
path is not yet well tested. Thrift's library and generated code should compile
with pretty much any GHC extensions or warnings you enable (or disable).
Please report this not being the case as a bug on
https://issues.apache.org/jira/secure/CreateIssue!default.jspa

Chances you'll need to muck a bit with Cabal flags to install Thrift:

CABAL_CONFIGURE_FLAGS="--user" ./configure

Base Types
==========

The mapping from Thrift types to Haskell's is:

 * double -> Double
 * byte -> Data.Word.Word8
 * i16 -> Data.Int.Int16
 * i32 -> Data.Int.Int32
 * i64 -> Data.Int.Int64
 * string -> String
 * binary -> Data.ByteString.Lazy
 * bool -> Boolean

Enums
=====

Become Haskell 'data' types. Use fromEnum to get out the int value.

Structs
=======

Become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All
fields are Maybe types.

Exceptions
==========

Identical to structs. Throw them with throwDyn. Catch them with catchDyn.

Client
======

Just a bunch of functions. You may have to import a bunch of client files to
deal with inheritance.

Interface
=========

You should only have to import the last one in the chain of inheritors. To make
an interface, declare a label:

  data MyIface = MyIface

and then declare it an instance of each iface class, starting with the superest
class and proceding down (all the while defining the methods).  Then pass your
label to process as the handler.

Processor
=========

Just a function that takes a handler label, protocols. It calls the
superclasses process if there is a superclass.

