module Data.Tuple.OneTuple (OneTuple(OneTuple), only) where
import Control.Applicative
import Control.Monad
import Control.Monad.Fix
import Data.Foldable
import Data.Ix
import Data.Monoid
import Data.Traversable
data OneTuple a
= OneTuple a
deriving (Eq,Ord,Bounded,Show,Read)
only :: OneTuple a
-> a
only (OneTuple x) = x
instance (Enum a) => Enum (OneTuple a) where
succ = liftA succ
pred = liftA pred
toEnum = pure . toEnum
fromEnum (OneTuple x) = fromEnum x
instance (Ix a) => Ix (OneTuple a) where
range (OneTuple x, OneTuple y) = map OneTuple (range (x,y))
index (OneTuple x, OneTuple y) (OneTuple z) = index (x,y) z
inRange (OneTuple x, OneTuple y) (OneTuple z) = inRange (x,y) z
instance Foldable OneTuple where
fold (OneTuple m) = m
foldMap f (OneTuple x) = f x
foldr f b (OneTuple x) = f x b
foldl f a (OneTuple x) = f a x
foldr1 _f (OneTuple x) = x
foldl1 _f (OneTuple x) = x
instance Traversable OneTuple where
sequenceA (OneTuple x) = fmap OneTuple x
instance Functor OneTuple where
fmap f (OneTuple x) = OneTuple (f x)
instance Applicative OneTuple where
pure = return
(<*>) = ap
instance Monad OneTuple where
(OneTuple x) >>= f = f x
return = OneTuple
instance (Monoid a) => Monoid (OneTuple a) where
mempty = OneTuple mempty
mappend (OneTuple x) (OneTuple y) = OneTuple (mappend x y)
mconcat = Prelude.foldr1 mappend
instance MonadFix OneTuple where
mfix f = let a = f (only a) in a