{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
module PlutusTx.Semigroup (Semigroup (..), Max (..), Min (..)) where
import Data.Monoid (First (..))
import Data.Semigroup (Dual (..), Endo (..))
import PlutusTx.Base
import PlutusTx.Builtins qualified as Builtins
import PlutusTx.Functor
import PlutusTx.List ((++))
import PlutusTx.Ord (Ord (..), Ordering (..))
import Prelude (Maybe (..))
infixr 6 <>
class Semigroup a where
    
    (<>) :: a -> a -> a
    
    
instance Semigroup Builtins.BuiltinByteString where
    {-# INLINABLE (<>) #-}
    <> :: BuiltinByteString -> BuiltinByteString -> BuiltinByteString
(<>) = BuiltinByteString -> BuiltinByteString -> BuiltinByteString
Builtins.appendByteString
instance Semigroup Builtins.BuiltinString where
    {-# INLINABLE (<>) #-}
    <> :: BuiltinString -> BuiltinString -> BuiltinString
(<>) = BuiltinString -> BuiltinString -> BuiltinString
Builtins.appendString
instance Semigroup [a] where
    {-# INLINABLE (<>) #-}
    <> :: [a] -> [a] -> [a]
(<>) = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)
instance (Semigroup a, Semigroup b) => Semigroup (a, b) where
    {-# INLINABLE (<>) #-}
    (a
a1, b
b1) <> :: (a, b) -> (a, b) -> (a, b)
<> (a
a2, b
b2) = (a
a1 a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
a2, b
b1 b -> b -> b
forall a. Semigroup a => a -> a -> a
<> b
b2)
instance Semigroup a => Semigroup (Maybe a) where
    Just a
a1 <> :: Maybe a -> Maybe a -> Maybe a
<> Just a
a2 = a -> Maybe a
forall a. a -> Maybe a
Just (a
a1 a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
a2)
    Just a
a1 <> Maybe a
Nothing = a -> Maybe a
forall a. a -> Maybe a
Just a
a1
    Maybe a
Nothing <> Just a
a2 = a -> Maybe a
forall a. a -> Maybe a
Just a
a2
    Maybe a
Nothing <> Maybe a
Nothing = Maybe a
forall a. Maybe a
Nothing
instance Semigroup Ordering where
    Ordering
LT <> :: Ordering -> Ordering -> Ordering
<> Ordering
_ = Ordering
LT
    Ordering
EQ <> Ordering
y = Ordering
y
    Ordering
GT <> Ordering
_ = Ordering
GT
instance Semigroup () where
    ()
_ <> :: () -> () -> ()
<> ()
_ = ()
instance Semigroup a => Semigroup (Dual a) where
    {-# INLINABLE (<>) #-}
    Dual a
a1 <> :: Dual a -> Dual a -> Dual a
<> Dual a
a2 = a -> Dual a
forall a. a -> Dual a
Dual (a
a2 a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
a1)
instance Semigroup (Endo a) where
    {-# INLINABLE (<>) #-}
    Endo a -> a
f1 <> :: Endo a -> Endo a -> Endo a
<> Endo a -> a
f2 = (a -> a) -> Endo a
forall a. (a -> a) -> Endo a
Endo (a -> a
f1 (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f2)
instance Semigroup (First a) where
    {-# INLINABLE (<>) #-}
    First Maybe a
Nothing <> :: First a -> First a -> First a
<> First a
b = First a
b
    First a
a             <> First a
_ = First a
a
newtype Max a = Max { Max a -> a
getMax :: a }
instance Functor Max where
    {-# INLINABLE fmap #-}
    fmap :: (a -> b) -> Max a -> Max b
fmap a -> b
f (Max a
a) = b -> Max b
forall a. a -> Max a
Max (a -> b
f a
a)
instance Ord a => Semigroup (Max a) where
    {-# INLINABLE (<>) #-}
    (Max a
a1) <> :: Max a -> Max a -> Max a
<> (Max a
a2) = a -> Max a
forall a. a -> Max a
Max (a -> a -> a
forall a. Ord a => a -> a -> a
max a
a1 a
a2)
newtype Min a = Min { Min a -> a
getMin :: a }
instance Functor Min where
    {-# INLINABLE fmap #-}
    fmap :: (a -> b) -> Min a -> Min b
fmap a -> b
f (Min a
a) = b -> Min b
forall a. a -> Min a
Min (a -> b
f a
a)
instance Ord a => Semigroup (Min a) where
    {-# INLINABLE (<>) #-}
    (Min a
a1) <> :: Min a -> Min a -> Min a
<> (Min a
a2) = a -> Min a
forall a. a -> Min a
Min (a -> a -> a
forall a. Ord a => a -> a -> a
min a
a1 a
a2)