{-# LANGUAGE CPP             #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module:      TextShow.Data.Semigroup
Copyright:   (C) 2014-2015 Ryan Scott
License:     BSD-style (see the file LICENSE)
Maintainer:  Ryan Scott
Stability:   Provisional
Portability: GHC

Monomorphic 'TextShow' functions for @Semigroup@ data types.

/Since: 2/
-}
module TextShow.Data.Semigroup (
      showbMinPrecWith
    , showbMaxPrecWith
    , showbFirstPrecWith
    , showbLastPrecWith
    , showbWrappedMonoidPrecWith
    , showbOptionPrecWith
    , showbArgPrecWith2
    ) where

import Data.Semigroup (Min, Max, First, Last, WrappedMonoid, Option, Arg)

import TextShow (Builder, showbPrecWith, showbPrecWith2)
import TextShow.TH (deriveTextShow, deriveTextShow1, deriveTextShow2)

#include "inline.h"

-- | Convert a 'Min' value to a 'Builder' with the given show function and precedence.
--
-- /Since: 2/
showbMinPrecWith :: (Int -> a -> Builder) -> Int -> Min a -> Builder
showbMinPrecWith = showbPrecWith
{-# INLINE showbMinPrecWith #-}

-- | Convert a 'Max' value to a 'Builder' with the given show function and precedence.
--
-- /Since: 2/
showbMaxPrecWith :: (Int -> a -> Builder) -> Int -> Max a -> Builder
showbMaxPrecWith = showbPrecWith
{-# INLINE showbMaxPrecWith #-}

-- | Convert a 'First' value to a 'Builder' with the given show function and precedence.
--
-- /Since: 2/
showbFirstPrecWith :: (Int -> a -> Builder) -> Int -> First a -> Builder
showbFirstPrecWith = showbPrecWith
{-# INLINE showbFirstPrecWith #-}

-- | Convert a 'Last' value to a 'Builder' with the given show function and precedence.
--
-- /Since: 2/
showbLastPrecWith :: (Int -> a -> Builder) -> Int -> Last a -> Builder
showbLastPrecWith = showbPrecWith
{-# INLINE showbLastPrecWith #-}

-- | Convert a 'WrappedMonoid' to a 'Builder' with the given show function
-- and precedence.
--
-- /Since: 2/
showbWrappedMonoidPrecWith :: (Int -> m -> Builder) -> Int -> WrappedMonoid m -> Builder
showbWrappedMonoidPrecWith = showbPrecWith
{-# INLINE showbWrappedMonoidPrecWith #-}

-- | Convert an 'Option' value to a 'Builder' with the given show function
-- and precedence.
--
-- /Since: 2/
showbOptionPrecWith :: (Int -> a -> Builder) -> Int -> Option a -> Builder
showbOptionPrecWith = showbPrecWith
{-# INLINE showbOptionPrecWith #-}

-- | Convert an 'Arg' value to a 'Builder' with the given show functions and precedence.
--
-- /Since: 2/
showbArgPrecWith2 :: (Int -> a -> Builder) -> (Int -> b -> Builder)
                  -> Int -> Arg a b -> Builder
showbArgPrecWith2 = showbPrecWith2
{-# INLINE showbArgPrecWith2 #-}

$(deriveTextShow  ''Min)
$(deriveTextShow1 ''Min)

$(deriveTextShow  ''Max)
$(deriveTextShow1 ''Max)

$(deriveTextShow  ''First)
$(deriveTextShow1 ''First)

$(deriveTextShow  ''Last)
$(deriveTextShow1 ''Last)

$(deriveTextShow  ''WrappedMonoid)
$(deriveTextShow1 ''WrappedMonoid)

$(deriveTextShow  ''Option)
$(deriveTextShow1 ''Option)

$(deriveTextShow  ''Arg)
$(deriveTextShow1 ''Arg)
$(deriveTextShow2 ''Arg)