regions-0.4: Control/Resource.hs
{-# LANGUAGE UnicodeSyntax, NoImplicitPrelude, TypeFamilies #-}
-------------------------------------------------------------------------------
-- |
-- Module : Control.Resource
-- Copyright : (c) 2009 Bas van Dijk
-- License : BSD3 (see the file LICENSE)
-- Maintainer : Bas van Dijk <v.dijk.bas@gmail.com>
--
-- Unsafely opening and closing of scarce resources.
--
--------------------------------------------------------------------------------
module Control.Resource
( Resource
, Handle
, openResource
, closeResource
) where
import System.IO ( IO )
{-| Class of /scarce/ resources. A scarce resource is a resource that only one
user can use at a time. (like a file, memory pointer or USB device for
example).
Because of the scarcity, these resources need to be /opened/ to grant temporary
sole access to the resource. When the resource is no longer needed it should be
/closed/ a.s.a.p to grant others access to the resource.
-}
class Resource resource where
data Handle resource ∷ *
-- | Yield an @IO@ computation that opens the given resource and returns a
-- @Handle@ on it.
--
-- Think of a handle as your private session with the resource. As long as
-- you have it, other users can't use the resource. So don't forget to close
-- this session with the resource as soon as you're done with it.
openResource ∷ resource → IO (Handle resource)
-- | Yield an @IO@ computation that closes the resource identified by the
-- given @Handle@.
--
-- /Warning/: Using the @Handle@ after the resource has been closed will
-- usually throw an exception or result in a program crash!
closeResource ∷ Handle resource → IO ()