On 12/13/06, Taral <[EMAIL PROTECTED]> wrote:
Third, we can split handles out as actual objects now:

This idea resembles how a descriptor is modelled in the last version
of HLADSPA. The difference is that a handle is modelled as a type
class and not a record (see
http://www.student.nada.kth.se/~alfonsoa/HLADSPA/HLADSPA-0.2.1/src/HLADSPA.hs
)


data Handle =
    Handle {descriptor :: Descriptor,
            activate :: IO (),
            -- (LadspaIndex,PortData) indicates the portnumber and its data
            run :: LadspaIndex -> [(LadspaIndex,PortData)] -> IO
[(LadspaIndex, PortData)],
            deactivate :: IO (),
            cleanup :: IO (),
           }


I wouldn't quite call this a Handle ... actually it only contains the
functions which operate over a handle (I would better call it
Instance).  It lacks the handle itself (the state passed to, and
possibly altered by, the functions of an instance) and makes the
instance stateless.

e.g. you modified

            run                    :: hd                       ->
                                       LadspaIndex              ->
                                       [(LadspaIndex,PortData)] ->
                                       ([(LadspaIndex,PortData)], hd),

into

            run :: LadspaIndex -> [(LadspaIndex,PortData)] ->
IO[(LadspaIndex, PortData)]



Now the behaviour of run over the input audio doesn't depend on any
state. That state is a must (and that's why handles are used).
Otherwise things such as a delay effect wouldn't be able to remember
how many samples it did process already between calls to run and thus
wouldn't be feasible to implement.

Then you'll want helpers that use Control.Exception.bracket ...

Well, I couldn't find that function in hoogle and it's not present at
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html

But I think that you are suggesting is to leave activate or deactivate
undefined in the record if they are not required. Then it should be
checked wheter they are undefined or not controlling if a exception is
raised when attempting to access them.

I don't see how that is an advantage compared to using Maybe. Actually
Nothing is more expressive than omitting the functions and furthermore
I don't think that leaving record fiedls undefined is a good practice
in general.


You can also optionally use cleanup as the finalizer for the
ForeignPtr underlying Handles ...

I don't see what you mean here. I'm not using ForeignPtrs at all.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to