{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DataKinds #-}
module Control.Category.OneObject where

import Prelude hiding (id, (.))
import Control.Category

newtype OneObject m (a :: ()) (b :: ()) = OneObject m
    deriving stock (Int -> OneObject m a b -> ShowS
[OneObject m a b] -> ShowS
OneObject m a b -> String
(Int -> OneObject m a b -> ShowS)
-> (OneObject m a b -> String)
-> ([OneObject m a b] -> ShowS)
-> Show (OneObject m a b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall m (a :: ()) (b :: ()).
Show m =>
Int -> OneObject m a b -> ShowS
forall m (a :: ()) (b :: ()). Show m => [OneObject m a b] -> ShowS
forall m (a :: ()) (b :: ()). Show m => OneObject m a b -> String
$cshowsPrec :: forall m (a :: ()) (b :: ()).
Show m =>
Int -> OneObject m a b -> ShowS
showsPrec :: Int -> OneObject m a b -> ShowS
$cshow :: forall m (a :: ()) (b :: ()). Show m => OneObject m a b -> String
show :: OneObject m a b -> String
$cshowList :: forall m (a :: ()) (b :: ()). Show m => [OneObject m a b] -> ShowS
showList :: [OneObject m a b] -> ShowS
Show)
    deriving newtype (OneObject m a b -> OneObject m a b -> Bool
(OneObject m a b -> OneObject m a b -> Bool)
-> (OneObject m a b -> OneObject m a b -> Bool)
-> Eq (OneObject m a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall m (a :: ()) (b :: ()).
Eq m =>
OneObject m a b -> OneObject m a b -> Bool
$c== :: forall m (a :: ()) (b :: ()).
Eq m =>
OneObject m a b -> OneObject m a b -> Bool
== :: OneObject m a b -> OneObject m a b -> Bool
$c/= :: forall m (a :: ()) (b :: ()).
Eq m =>
OneObject m a b -> OneObject m a b -> Bool
/= :: OneObject m a b -> OneObject m a b -> Bool
Eq, Eq (OneObject m a b)
Eq (OneObject m a b) =>
(OneObject m a b -> OneObject m a b -> Ordering)
-> (OneObject m a b -> OneObject m a b -> Bool)
-> (OneObject m a b -> OneObject m a b -> Bool)
-> (OneObject m a b -> OneObject m a b -> Bool)
-> (OneObject m a b -> OneObject m a b -> Bool)
-> (OneObject m a b -> OneObject m a b -> OneObject m a b)
-> (OneObject m a b -> OneObject m a b -> OneObject m a b)
-> Ord (OneObject m a b)
OneObject m a b -> OneObject m a b -> Bool
OneObject m a b -> OneObject m a b -> Ordering
OneObject m a b -> OneObject m a b -> OneObject m a b
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 m (a :: ()) (b :: ()). Ord m => Eq (OneObject m a b)
forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Bool
forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Ordering
forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
$ccompare :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Ordering
compare :: OneObject m a b -> OneObject m a b -> Ordering
$c< :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Bool
< :: OneObject m a b -> OneObject m a b -> Bool
$c<= :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Bool
<= :: OneObject m a b -> OneObject m a b -> Bool
$c> :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Bool
> :: OneObject m a b -> OneObject m a b -> Bool
$c>= :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> Bool
>= :: OneObject m a b -> OneObject m a b -> Bool
$cmax :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
max :: OneObject m a b -> OneObject m a b -> OneObject m a b
$cmin :: forall m (a :: ()) (b :: ()).
Ord m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
min :: OneObject m a b -> OneObject m a b -> OneObject m a b
Ord, NonEmpty (OneObject m a b) -> OneObject m a b
OneObject m a b -> OneObject m a b -> OneObject m a b
(OneObject m a b -> OneObject m a b -> OneObject m a b)
-> (NonEmpty (OneObject m a b) -> OneObject m a b)
-> (forall b.
    Integral b =>
    b -> OneObject m a b -> OneObject m a b)
-> Semigroup (OneObject m a b)
forall b. Integral b => b -> OneObject m a b -> OneObject m a b
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall m (a :: ()) (b :: ()).
Semigroup m =>
NonEmpty (OneObject m a b) -> OneObject m a b
forall m (a :: ()) (b :: ()).
Semigroup m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
forall m (a :: ()) (b :: ()) b.
(Semigroup m, Integral b) =>
b -> OneObject m a b -> OneObject m a b
$c<> :: forall m (a :: ()) (b :: ()).
Semigroup m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
<> :: OneObject m a b -> OneObject m a b -> OneObject m a b
$csconcat :: forall m (a :: ()) (b :: ()).
Semigroup m =>
NonEmpty (OneObject m a b) -> OneObject m a b
sconcat :: NonEmpty (OneObject m a b) -> OneObject m a b
$cstimes :: forall m (a :: ()) (b :: ()) b.
(Semigroup m, Integral b) =>
b -> OneObject m a b -> OneObject m a b
stimes :: forall b. Integral b => b -> OneObject m a b -> OneObject m a b
Semigroup, Semigroup (OneObject m a b)
OneObject m a b
Semigroup (OneObject m a b) =>
OneObject m a b
-> (OneObject m a b -> OneObject m a b -> OneObject m a b)
-> ([OneObject m a b] -> OneObject m a b)
-> Monoid (OneObject m a b)
[OneObject m a b] -> OneObject m a b
OneObject m a b -> OneObject m a b -> OneObject m a b
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall m (a :: ()) (b :: ()).
Monoid m =>
Semigroup (OneObject m a b)
forall m (a :: ()) (b :: ()). Monoid m => OneObject m a b
forall m (a :: ()) (b :: ()).
Monoid m =>
[OneObject m a b] -> OneObject m a b
forall m (a :: ()) (b :: ()).
Monoid m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
$cmempty :: forall m (a :: ()) (b :: ()). Monoid m => OneObject m a b
mempty :: OneObject m a b
$cmappend :: forall m (a :: ()) (b :: ()).
Monoid m =>
OneObject m a b -> OneObject m a b -> OneObject m a b
mappend :: OneObject m a b -> OneObject m a b -> OneObject m a b
$cmconcat :: forall m (a :: ()) (b :: ()).
Monoid m =>
[OneObject m a b] -> OneObject m a b
mconcat :: [OneObject m a b] -> OneObject m a b
Monoid)

instance Monoid m => Category (OneObject m) where
    id :: forall (a :: ()). OneObject m a a
id = m -> OneObject m a a
forall m (a :: ()) (b :: ()). m -> OneObject m a b
OneObject m
forall a. Monoid a => a
mempty
    OneObject m
m1 . :: forall (b :: ()) (c :: ()) (a :: ()).
OneObject m b c -> OneObject m a b -> OneObject m a c
. OneObject m
m2 = m -> OneObject m a c
forall m (a :: ()) (b :: ()). m -> OneObject m a b
OneObject (m
m1 m -> m -> m
forall a. Semigroup a => a -> a -> a
<> m
m2)