{-# LANGUAGE Rank2Types #-}

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

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
<| :: forall v. Cons v => Elem v -> v -> v
(<|) = forall v. Cons v => Elem v -> v -> v
HW.cons
{-# INLINE (<|) #-}

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

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