-- |OneTuple fills the /tuple gap/ with a singleton tuple.
--
-- OneTuple /does not support/ the usual parenthesized tuple syntax.
--
-- OneTuple
--
--   * has the expected laziness properties
--
--   * can be pattern-matched
--
--   * ships with instances for several standard type classes,
--     including all those supported by H98-standard tuples
--
--   * requires no language extensions, except for hierarchical modules

module Data.Tuple.OneTuple (OneTuple(OneTuple), only) where

import Control.Applicative (Applicative (..))
import Control.Monad       (ap)
import Control.Monad.Fix   (MonadFix (..))
import Data.Foldable       (Foldable (..))
import Data.Ix             (Ix (..))
import Data.Monoid         (Monoid (..))
import Data.Semigroup      (Semigroup (..))
import Data.Traversable    (Traversable (..))

-- |OneTuple is the singleton tuple data type.
data OneTuple a
    = OneTuple a  -- ^ singleton tuple constructor
    deriving (OneTuple a -> OneTuple a -> Bool
(OneTuple a -> OneTuple a -> Bool)
-> (OneTuple a -> OneTuple a -> Bool) -> Eq (OneTuple a)
forall a. Eq a => OneTuple a -> OneTuple a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OneTuple a -> OneTuple a -> Bool
$c/= :: forall a. Eq a => OneTuple a -> OneTuple a -> Bool
== :: OneTuple a -> OneTuple a -> Bool
$c== :: forall a. Eq a => OneTuple a -> OneTuple a -> Bool
Eq,Eq (OneTuple a)
Eq (OneTuple a) =>
(OneTuple a -> OneTuple a -> Ordering)
-> (OneTuple a -> OneTuple a -> Bool)
-> (OneTuple a -> OneTuple a -> Bool)
-> (OneTuple a -> OneTuple a -> Bool)
-> (OneTuple a -> OneTuple a -> Bool)
-> (OneTuple a -> OneTuple a -> OneTuple a)
-> (OneTuple a -> OneTuple a -> OneTuple a)
-> Ord (OneTuple a)
OneTuple a -> OneTuple a -> Bool
OneTuple a -> OneTuple a -> Ordering
OneTuple a -> OneTuple a -> OneTuple a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (OneTuple a)
forall a. Ord a => OneTuple a -> OneTuple a -> Bool
forall a. Ord a => OneTuple a -> OneTuple a -> Ordering
forall a. Ord a => OneTuple a -> OneTuple a -> OneTuple a
min :: OneTuple a -> OneTuple a -> OneTuple a
$cmin :: forall a. Ord a => OneTuple a -> OneTuple a -> OneTuple a
max :: OneTuple a -> OneTuple a -> OneTuple a
$cmax :: forall a. Ord a => OneTuple a -> OneTuple a -> OneTuple a
>= :: OneTuple a -> OneTuple a -> Bool
$c>= :: forall a. Ord a => OneTuple a -> OneTuple a -> Bool
> :: OneTuple a -> OneTuple a -> Bool
$c> :: forall a. Ord a => OneTuple a -> OneTuple a -> Bool
<= :: OneTuple a -> OneTuple a -> Bool
$c<= :: forall a. Ord a => OneTuple a -> OneTuple a -> Bool
< :: OneTuple a -> OneTuple a -> Bool
$c< :: forall a. Ord a => OneTuple a -> OneTuple a -> Bool
compare :: OneTuple a -> OneTuple a -> Ordering
$ccompare :: forall a. Ord a => OneTuple a -> OneTuple a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (OneTuple a)
Ord,OneTuple a
OneTuple a -> OneTuple a -> Bounded (OneTuple a)
forall a. a -> a -> Bounded a
forall a. Bounded a => OneTuple a
maxBound :: OneTuple a
$cmaxBound :: forall a. Bounded a => OneTuple a
minBound :: OneTuple a
$cminBound :: forall a. Bounded a => OneTuple a
Bounded,Int -> OneTuple a -> ShowS
[OneTuple a] -> ShowS
OneTuple a -> String
(Int -> OneTuple a -> ShowS)
-> (OneTuple a -> String)
-> ([OneTuple a] -> ShowS)
-> Show (OneTuple a)
forall a. Show a => Int -> OneTuple a -> ShowS
forall a. Show a => [OneTuple a] -> ShowS
forall a. Show a => OneTuple a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OneTuple a] -> ShowS
$cshowList :: forall a. Show a => [OneTuple a] -> ShowS
show :: OneTuple a -> String
$cshow :: forall a. Show a => OneTuple a -> String
showsPrec :: Int -> OneTuple a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> OneTuple a -> ShowS
Show,ReadPrec [OneTuple a]
ReadPrec (OneTuple a)
Int -> ReadS (OneTuple a)
ReadS [OneTuple a]
(Int -> ReadS (OneTuple a))
-> ReadS [OneTuple a]
-> ReadPrec (OneTuple a)
-> ReadPrec [OneTuple a]
-> Read (OneTuple a)
forall a. Read a => ReadPrec [OneTuple a]
forall a. Read a => ReadPrec (OneTuple a)
forall a. Read a => Int -> ReadS (OneTuple a)
forall a. Read a => ReadS [OneTuple a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [OneTuple a]
$creadListPrec :: forall a. Read a => ReadPrec [OneTuple a]
readPrec :: ReadPrec (OneTuple a)
$creadPrec :: forall a. Read a => ReadPrec (OneTuple a)
readList :: ReadS [OneTuple a]
$creadList :: forall a. Read a => ReadS [OneTuple a]
readsPrec :: Int -> ReadS (OneTuple a)
$creadsPrec :: forall a. Read a => Int -> ReadS (OneTuple a)
Read)

-- |The 'only' function extracts the OneTuple's only member.
-- (Compare to 'fst' and 'snd'.)
only :: OneTuple a -- ^ takes a singleton tuple argument
     -> a          -- ^ returns the only element in the tuple
only :: OneTuple a -> a
only (OneTuple x :: a
x) = a
x

instance (Enum a) => Enum (OneTuple a) where
    succ :: OneTuple a -> OneTuple a
succ = (a -> a) -> OneTuple a -> OneTuple a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Enum a => a -> a
succ
    pred :: OneTuple a -> OneTuple a
pred = (a -> a) -> OneTuple a -> OneTuple a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Enum a => a -> a
pred
    toEnum :: Int -> OneTuple a
toEnum = a -> OneTuple a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> OneTuple a) -> (Int -> a) -> Int -> OneTuple a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a
forall a. Enum a => Int -> a
toEnum
    fromEnum :: OneTuple a -> Int
fromEnum (OneTuple x :: a
x) = a -> Int
forall a. Enum a => a -> Int
fromEnum a
x

instance (Ix a) => Ix (OneTuple a) where
    range :: (OneTuple a, OneTuple a) -> [OneTuple a]
range   (OneTuple x :: a
x, OneTuple y :: a
y) = (a -> OneTuple a) -> [a] -> [OneTuple a]
forall a b. (a -> b) -> [a] -> [b]
map a -> OneTuple a
forall a. a -> OneTuple a
OneTuple ((a, a) -> [a]
forall a. Ix a => (a, a) -> [a]
range (a
x,a
y))
    index :: (OneTuple a, OneTuple a) -> OneTuple a -> Int
index   (OneTuple x :: a
x, OneTuple y :: a
y) (OneTuple z :: a
z) = (a, a) -> a -> Int
forall a. Ix a => (a, a) -> a -> Int
index   (a
x,a
y) a
z
    inRange :: (OneTuple a, OneTuple a) -> OneTuple a -> Bool
inRange (OneTuple x :: a
x, OneTuple y :: a
y) (OneTuple z :: a
z) = (a, a) -> a -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (a
x,a
y) a
z

instance Foldable OneTuple where
    fold :: OneTuple m -> m
fold (OneTuple m :: m
m) = m
m
    foldMap :: (a -> m) -> OneTuple a -> m
foldMap f :: a -> m
f (OneTuple x :: a
x) = a -> m
f a
x
    foldr :: (a -> b -> b) -> b -> OneTuple a -> b
foldr f :: a -> b -> b
f b :: b
b (OneTuple x :: a
x) = a -> b -> b
f a
x b
b
    foldl :: (b -> a -> b) -> b -> OneTuple a -> b
foldl f :: b -> a -> b
f a :: b
a (OneTuple x :: a
x) = b -> a -> b
f b
a a
x
    foldr1 :: (a -> a -> a) -> OneTuple a -> a
foldr1 _f :: a -> a -> a
_f (OneTuple x :: a
x) = a
x
    foldl1 :: (a -> a -> a) -> OneTuple a -> a
foldl1 _f :: a -> a -> a
_f (OneTuple x :: a
x) = a
x

instance Traversable OneTuple where
    traverse :: (a -> f b) -> OneTuple a -> f (OneTuple b)
traverse f :: a -> f b
f (OneTuple x :: a
x) = (b -> OneTuple b) -> f b -> f (OneTuple b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> OneTuple b
forall a. a -> OneTuple a
OneTuple (a -> f b
f a
x)
    sequenceA :: OneTuple (f a) -> f (OneTuple a)
sequenceA (OneTuple x :: f a
x) = (a -> OneTuple a) -> f a -> f (OneTuple a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> OneTuple a
forall a. a -> OneTuple a
OneTuple f a
x

instance Functor OneTuple where
    fmap :: (a -> b) -> OneTuple a -> OneTuple b
fmap f :: a -> b
f (OneTuple x :: a
x) = b -> OneTuple b
forall a. a -> OneTuple a
OneTuple (a -> b
f a
x)

instance Applicative OneTuple where
    pure :: a -> OneTuple a
pure = a -> OneTuple a
forall a. a -> OneTuple a
OneTuple

    OneTuple f :: a -> b
f <*> :: OneTuple (a -> b) -> OneTuple a -> OneTuple b
<*> OneTuple x :: a
x = b -> OneTuple b
forall a. a -> OneTuple a
OneTuple (a -> b
f a
x)
    _ *> :: OneTuple a -> OneTuple b -> OneTuple b
*> x :: OneTuple b
x = OneTuple b
x
    x :: OneTuple a
x <* :: OneTuple a -> OneTuple b -> OneTuple a
<* _ = OneTuple a
x

instance Monad OneTuple where
    return :: a -> OneTuple a
return = a -> OneTuple a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    >> :: OneTuple a -> OneTuple b -> OneTuple b
(>>) = OneTuple a -> OneTuple b -> OneTuple b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
    (OneTuple x :: a
x) >>= :: OneTuple a -> (a -> OneTuple b) -> OneTuple b
>>= f :: a -> OneTuple b
f = a -> OneTuple b
f a
x

instance (Semigroup a) => Semigroup (OneTuple a) where
    OneTuple x :: a
x <> :: OneTuple a -> OneTuple a -> OneTuple a
<> OneTuple y :: a
y = a -> OneTuple a
forall a. a -> OneTuple a
OneTuple (a
x a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
y)

instance (Monoid a) => Monoid (OneTuple a) where
    mempty :: OneTuple a
mempty = a -> OneTuple a
forall a. a -> OneTuple a
OneTuple a
forall a. Monoid a => a
mempty
    mappend :: OneTuple a -> OneTuple a -> OneTuple a
mappend (OneTuple x :: a
x) (OneTuple y :: a
y) = a -> OneTuple a
forall a. a -> OneTuple a
OneTuple (a -> a -> a
forall a. Monoid a => a -> a -> a
mappend a
x a
y)

instance MonadFix OneTuple where
    mfix :: (a -> OneTuple a) -> OneTuple a
mfix f :: a -> OneTuple a
f = let a :: OneTuple a
a = a -> OneTuple a
f (OneTuple a -> a
forall a. OneTuple a -> a
only OneTuple a
a) in OneTuple a
a