{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTSyntax #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UnliftedNewtypes #-}
{-# LANGUAGE ViewPatterns #-}

module Data.Maybe.Word16
  ( MaybeWord16# (..)
  , pattern JustWord16#
  , pattern NothingWord16#
  ) where

import GHC.Exts

-- The value 65536 is used to mean Nothing. Values above this
-- should not be used.
newtype MaybeWord16# :: TYPE 'WordRep where
  MaybeWord16# :: Word# -> MaybeWord16#

pattern JustWord16# :: Word16# -> MaybeWord16#
pattern $mJustWord16# :: forall {r}. MaybeWord16# -> (Word16# -> r) -> ((# #) -> r) -> r
$bJustWord16# :: Word16# -> MaybeWord16#
JustWord16# a <- (helper -> (# 0#, a #))
  where
    JustWord16# Word16#
w = Word# -> MaybeWord16#
MaybeWord16# (Word16# -> Word#
word16ToWord# Word16#
w)

helper :: MaybeWord16# -> (# Int#, Word16# #)
{-# INLINE helper #-}
helper :: MaybeWord16# -> (# Int#, Word16# #)
helper (MaybeWord16# Word#
x) = (# Word# -> Word# -> Int#
eqWord# Word#
x Word#
65536##, Word# -> Word16#
wordToWord16# Word#
x #)

pattern NothingWord16# :: MaybeWord16#
pattern $mNothingWord16# :: forall {r}. MaybeWord16# -> ((# #) -> r) -> ((# #) -> r) -> r
$bNothingWord16# :: (# #) -> MaybeWord16#
NothingWord16# = MaybeWord16# 65536##