In response to a Wenzel P. P. Peppmeyer post I have a thing to add.
The problem of indicating the “no more data” condition is something I dealt with
for a couple of times too. While I do like the last solution from Wenzel post,
the one with the Failure, but my approach was different. Nil appeals to me
as more appropriate for the task in some cases. For example, while developing
Concurrent::PChannel I considered it this way:
The channel must be capable of transferring any user data. There must be no exception for what passes through, no false end-of-data markers. Therefore if
pollmethod returns a such a marker it has to be something indistinctively unique to the module.
My solution, in a simplified form, looked like this:
unit module Concurrent::PChannel;
role NoData is export { }
method poll {
...;
$fount ?? $packet !! (Nil but NoData)
}
Simple and straightforward! Because NoData role belongs to the module it
guarantees the uniqueness of the return value because the module itself would
never mangle with the data injected into the channel. Nor will it push anything
into it. Anyone trying to use Concurrent::PChannel::NoData for anything else
but testing method poll return value is aware of the consequences. And even
though I myself do not test for falseness of poll return value and only check
if the role is applied:
if $poll-returned-packed ~~ Concurrent::PChannel::NoData {
...
}
But from the boolean point of view Nil but NoData is a False and therefore
conforms to another condition in Wenzel’s post.
Comments