java-bridge-0.20130602: src/Foreign/Java/Maybe.hs
{-# LANGUAGE Haskell2010 #-}
{-# OPTIONS
-Wall
-fno-warn-orphans
#-}
-- |
-- Module : Foreign.Java.Maybe
-- Copyright : (c) Julian Fleischer 2013
-- License : MIT (See LICENSE file in cabal package)
--
-- Maintainer : julian.fleischer@fu-berlin.de
-- Stability : provisional
-- Portability : portable (Haskell2010)
--
-- Every java methods returns in priniciple either Nothing or
-- Just a value. This is quite cumbersome to work with. This module
-- contains utility functions for working with Maybe values in the
-- java monad.
--
-- This module offers the orphan instance (!)
--
-- > instance JavaObject a => JavaObject (Maybe a)
--
-- This instance allows you to apply 'toString' and the like
-- without unwrapping a 'Maybe' value.
--
-- Note that the 'asObject' function provided by this instance
-- is undefined (since @null@ is not an object). This is also the
-- reason why this instance is not included in "Foreign.Java" by
-- default. Invoking it will call @error "NullPointerException"@.
-- In other words: This fine module will bring back all the joy of
-- Java you might miss in Haskell :-)
--
-- 'toString' will return @null@ for @Nothing@.
--
-- 'hashCode' will return @0@ for @Nothing@.
--
-- 'classOf' will return the class for @java.lang.Void@ on @Nothing@,
-- as this is a class for which there gare no object instances. This is
-- only a stopgap and slightly incorrect, as null is not an object,
-- and does therefor not have a class.
module Foreign.Java.Maybe where
import Foreign.Java
instance JavaObject a => JavaObject (Maybe a) where
toString m = case m of
Just obj -> toString obj
Nothing -> return "null"
hashCode m = case m of
Just obj -> hashCode obj
Nothing -> return 0
asObject m = case m of
Just obj -> asObject obj
Nothing -> error "NullPointerException"
classOf m = case m of
Just obj -> classOf obj
Nothing -> getClass "java.lang.Void" >>= classOf