    {-# LANGUAGE CPP #-}

    #include "containers.h"

    {-# OPTIONS_HADDOCK hide #-}
    -- | Strict 'Maybe'

    module Utils.Containers.Internal.StrictMaybe (MaybeS (..), maybeS, toMaybe, toMaybeS) where

    #if !MIN_VERSION_base(4,8,0)
    import Data.Foldable (Foldable (..))
    import Data.Monoid (Monoid (..))
    #endif

    data MaybeS a = NothingS | JustS !a

    instance Foldable MaybeS where
      foldMap _ NothingS = mempty
      foldMap f (JustS a) = f a

    maybeS :: r -> (a -> r) -> MaybeS a -> r
    maybeS n _ NothingS = n
    maybeS _ j (JustS a) = j a

    toMaybe :: MaybeS a -> Maybe a
    toMaybe NothingS = Nothing
    toMaybe (JustS a) = Just a

    toMaybeS :: Maybe a -> MaybeS a
    toMaybeS Nothing = NothingS
    toMaybeS (Just a) = JustS a