{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-}
module MaybeHelp where
import Control.Lens

data Maybe' a = Just' {__Just' :: a} | Nothing'
    deriving (Eq,Ord,Show)

fromJust' :: Maybe' a -> a
fromJust' mx = case mx of
    Just' x -> x
    Nothing' -> error "no fromJust'"

isJust' :: Maybe' a -> Bool
isJust' Just' {} = True
isJust' Nothing' = False

isNothing' :: Maybe' a -> Bool
isNothing' Just' {} = False
isNothing' Nothing' = True

strictify :: Maybe a -> Maybe' a
strictify Nothing  = Nothing'
strictify (Just x) = Just' x

toggleJust :: Maybe a -> Maybe ()
toggleJust Nothing = Just ()
toggleJust _ = Nothing

makeLenses ''Maybe'
