{- |
Module      :  Data.MaybeLike.Instances
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 default instances of `MaybeLike` for most primitive "Unboxed" types

-}

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


module Data.MaybeLike.Instances
(

  module Data.MaybeLike

) where

import Data.Eq ((==))
import Prelude (Bounded(maxBound), (/), isNaN)
import Prelude (Float, Double)
import Data.Char
import Data.Int
import Data.Word
import qualified Data.Maybe as M

import Data.MaybeLike


instance MaybeLike (M.Maybe a) a where
    {-# INLINE nothing #-}
    nothing = M.Nothing
    {-# INLINE isNothing #-}
    isNothing = M.isNothing
    {-# INLINE just #-}
    just = M.Just
    {-# INLINE fromJust #-}
    fromJust = M.fromJust

instance MaybeLike Char Char where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Int Int where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Int8 Int8 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Int16 Int16 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Int32 Int32 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Int64 Int64 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v


instance MaybeLike Word Word where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Word8 Word8 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Word16 Word16 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Word32 Word32 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Word64 Word64 where
    {-# INLINE nothing #-}
    nothing = maxBound
    {-# INLINE isNothing #-}
    isNothing v = v == maxBound
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v


instance MaybeLike Float Float where
    {-# INLINE nothing #-}
    nothing = 0/0
    {-# INLINE isNothing #-}
    isNothing = isNaN
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v

instance MaybeLike Double Double where
    {-# INLINE nothing #-}
    nothing = 0/0
    {-# INLINE isNothing #-}
    isNothing = isNaN
    {-# INLINE just #-}
    just v = v
    {-# INLINE fromJust #-}
    fromJust v = v