{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE Rank2Types      #-}

module HaskellWorks.Data.Ops
  ( (<|)
  , (|>)
  , (><)
  ) where

import Data.Semigroup (Semigroup, (<>))

import qualified HaskellWorks.Data.Cons      as HW
import qualified HaskellWorks.Data.Container as HW
import qualified HaskellWorks.Data.Snoc      as HW

infixr 5 <|, ><

infixl 5 |>

(<|) :: HW.Cons v => HW.Elem v -> v -> v
(<|) = HW.cons
{-# INLINE (<|) #-}

(|>) :: HW.Snoc v => v -> HW.Elem v -> v
(|>) = HW.snoc
{-# INLINE (|>) #-}

(><) :: (Semigroup v, HW.Container v) => v -> v -> v
(><) = (<>)
{-# INLINE (><) #-}