    {-# 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 :: forall m a. Monoid m => (a -> m) -> MaybeS a -> m
    foldMap a -> m
    _ MaybeS a
    NothingS = m
    forall a. Monoid a => a
    mempty
      foldMap a -> m
    f (JustS a
    a) = a -> m
    f a
    a

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

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

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