{-# LANGUAGE DeriveFoldable    #-}
{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK hide       #-}
{-# OPTIONS_HADDOCK prune      #-}

-- |
-- Module      : Data.Hople
-- Copyright   : (c) Justin Le 2016
-- License     : BSD3
--
-- Maintainer  : justin@jle.im
-- Stability   : experimental
-- Portability : non-portable
--
-- Homogeneous strict tuples used for implementing 'liftU2', etc.

module Data.Hople
  ( H1(..)
  , H2(..)
  , H3(..)
  , H4(..)
  , H5(..)
  , curryH1, curryH2, curryH3, curryH4, curryH5
  , uncurryH1, uncurryH2, uncurryH3, uncurryH4, uncurryH5
  )
  where

import Prelude.Compat


data H1 a = H1 !a
  deriving (Functor, Foldable, Traversable, Show)

data H2 a = H2 !a !a
  deriving (Functor, Foldable, Traversable, Show)

data H3 a = H3 !a !a !a
  deriving (Functor, Foldable, Traversable, Show)

data H4 a = H4 !a !a !a !a
  deriving (Functor, Foldable, Traversable, Show)

data H5 a = H5 !a !a !a !a !a
  deriving (Functor, Foldable, Traversable, Show)

curryH1 :: (H1 a -> a) -> a -> a
curryH1 f x = f (H1 x)
{-# INLINE curryH1 #-}

curryH2 :: (H2 a -> a) -> a -> a -> a
curryH2 f x y = f (H2 x y)
{-# INLINE curryH2 #-}

curryH3 :: (H3 a -> a) -> a -> a -> a -> a
curryH3 f x y z = f (H3 x y z)
{-# INLINE curryH3 #-}

curryH4 :: (H4 a -> a) -> a -> a -> a -> a -> a
curryH4 f x y z a = f (H4 x y z a)
{-# INLINE curryH4 #-}

curryH5 :: (H5 a -> a) -> a -> a -> a -> a -> a -> a
curryH5 f x y z a b = f (H5 x y z a b)
{-# INLINE curryH5 #-}

uncurryH1 :: (a -> a) -> H1 a -> a
uncurryH1 f (H1 x) = f x
{-# INLINE uncurryH1 #-}

uncurryH2 :: (a -> a -> a) -> H2 a -> a
uncurryH2 f (H2 x y) = f x y
{-# INLINE uncurryH2 #-}

uncurryH3 :: (a -> a -> a -> a) -> H3 a -> a
uncurryH3 f (H3 x y z) = f x y z
{-# INLINE uncurryH3 #-}

uncurryH4 :: (a -> a -> a -> a -> a) -> H4 a -> a
uncurryH4 f (H4 x y z a) = f x y z a
{-# INLINE uncurryH4 #-}

uncurryH5 :: (a -> a -> a -> a -> a -> a) -> H5 a -> a
uncurryH5 f (H5 x y z a b) = f x y z a b
{-# INLINE uncurryH5 #-}