{- |
Module      :  Data.MaybeLike
Copyright   :  (c) Eduard Sergeev 2013
License     :  BSD-style (see the file LICENSE)

Maintainer  :  eduard.sergeev@gmail.com
Stability   :  experimental
Portability :  non-portable (multi-param classes, functional dependencies)

Defines MaybeLike typeclass - a generic way to look at some types as if they were Maybe

It is currently used to add maybe-ness to `unboxed` primitive types
in cases when it isn't possuble to just use `Maybe a` (e.g. unboxed arrays) 

-}

{-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses,
  FlexibleInstances, FunctionalDependencies #-}

module Data.MaybeLike
(

  MaybeLike(..)

) where

import Data.Bool

-- | An abstract interface to a type which may not have a value
class MaybeLike a v | a -> v where
    nothing :: a
    isNothing :: a -> Bool
    just :: v -> a
    fromJust :: a -> v