usb-safe-0.8: usb-safe.cabal
name: usb-safe
version: 0.8
cabal-version: >=1.6
build-type: Custom
license: BSD3
license-file: LICENSE
copyright: 2009–2010 Bas van Dijk
author: Bas van Dijk <v.dijk.bas@gmail.com>
maintainer: Bas van Dijk <v.dijk.bas@gmail.com>
stability: experimental
category: System, Monadic Regions
synopsis: Type-safe communication with USB devices.
description:
The @usb@ package provides a standard Haskell abstraction layer over
@bindings-libusb@ providing: abstract types instead of @Ptr@s, automatic
marshalling and unmarshalling, automatic garbage collection,
exceptions instead of integer return codes, etc..
.
While all that is very nice there are still some things that you can
do wrong. For example doing I/O with a closed device or reading from
or writing to an endpoint which doesn't belong to the claimed
interface. Or reading from an Out endpoint or writing to an In
endpoint.
.
@usb-safe@ provides the following guarantees:
.
* You can't reference handles to devices that are closed. In other words: no
I/O with closed handles is possible.
.
* The programmer specifies the /region/ in which devices should remain open. On
exit from the region the opened devices will be closed automatically.
.
* You can't reference handles to configurations that have not been set.
.
* You can't reference handles to interfaces that have not been claimed.
.
* Just like with devices, the programmer can specify the region in
which interfaces should remain claimed. On exit from the region
the claimed interfaces will be released automatically.
.
* You can't reference handles to alternates that have not been set.
.
* You can't reference endpoints that don't belong to a setted alternate.
.
* You can't read from an endpoint with an Out transfer direction.
.
* You can't write to an endpoint with an In transfer direction.
.
* You can't read from or write to endpoints with the unsupported transfer
types Control and Isochronous. Only I/O with endpoints with the Bulk and
Interrupt transfer types is allowed.
.
The primary technique used in usb-safe is called \"Lightweight monadic
regions\" which was invented by Oleg Kiselyov and Chung-chieh Shan.
See:
.
<http://okmij.org/ftp/Haskell/regions.html#light-weight>
.
This technique is implemented in the @regions@ package which is
re-exported from @usb-safe@.
.
See the @usb-safe-examples@ package for examples how to use this library:
.
@darcs get@ <http://code.haskell.org/~basvandijk/code/usb-safe-examples>
source-repository head
Type: darcs
Location: http://code.haskell.org/~basvandijk/code/usb-safe
Library
GHC-Options: -Wall -fno-warn-orphans
build-depends: base >= 4 && < 4.3
, base-unicode-symbols >= 0.1.1 && < 0.3
, usb >= 0.5 && < 0.6
, usb-enumerator >= 0.1 && < 0.2
, iteratee >= 0.3.5 && < 0.4
, bytestring >= 0.9 && < 0.10
, regions >= 0.6 && < 0.7
, transformers >= 0.2 && < 0.3
, MonadCatchIO-transformers >= 0.2 && < 0.3
exposed-modules: System.USB.Safe