{-# LANGUAGE NoImplicitPrelude #-}

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}

-- |

-- Module      : OAlg.Limes.Perspective

-- Description : concept of perspective

-- Copyright   : (c) Erich Gut

-- License     : BSD3

-- Maintainer  : zerich.gut@gmail.com

--

-- concept of 'Projective' and 'Injective'.

module OAlg.Limes.Perspective
  ( Perspective(..), ToPerspective
  ) where

import OAlg.Prelude

--------------------------------------------------------------------------------

-- Perspective -


-- | concept of 'Projective' and 'Injective'.

data Perspective = Projective | Injective deriving (Int -> Perspective -> ShowS
[Perspective] -> ShowS
Perspective -> String
(Int -> Perspective -> ShowS)
-> (Perspective -> String)
-> ([Perspective] -> ShowS)
-> Show Perspective
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Perspective -> ShowS
showsPrec :: Int -> Perspective -> ShowS
$cshow :: Perspective -> String
show :: Perspective -> String
$cshowList :: [Perspective] -> ShowS
showList :: [Perspective] -> ShowS
Show,Perspective -> Perspective -> Bool
(Perspective -> Perspective -> Bool)
-> (Perspective -> Perspective -> Bool) -> Eq Perspective
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Perspective -> Perspective -> Bool
== :: Perspective -> Perspective -> Bool
$c/= :: Perspective -> Perspective -> Bool
/= :: Perspective -> Perspective -> Bool
Eq,Eq Perspective
Eq Perspective =>
(Perspective -> Perspective -> Ordering)
-> (Perspective -> Perspective -> Bool)
-> (Perspective -> Perspective -> Bool)
-> (Perspective -> Perspective -> Bool)
-> (Perspective -> Perspective -> Bool)
-> (Perspective -> Perspective -> Perspective)
-> (Perspective -> Perspective -> Perspective)
-> Ord Perspective
Perspective -> Perspective -> Bool
Perspective -> Perspective -> Ordering
Perspective -> Perspective -> Perspective
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
$ccompare :: Perspective -> Perspective -> Ordering
compare :: Perspective -> Perspective -> Ordering
$c< :: Perspective -> Perspective -> Bool
< :: Perspective -> Perspective -> Bool
$c<= :: Perspective -> Perspective -> Bool
<= :: Perspective -> Perspective -> Bool
$c> :: Perspective -> Perspective -> Bool
> :: Perspective -> Perspective -> Bool
$c>= :: Perspective -> Perspective -> Bool
>= :: Perspective -> Perspective -> Bool
$cmax :: Perspective -> Perspective -> Perspective
max :: Perspective -> Perspective -> Perspective
$cmin :: Perspective -> Perspective -> Perspective
min :: Perspective -> Perspective -> Perspective
Ord,Int -> Perspective
Perspective -> Int
Perspective -> [Perspective]
Perspective -> Perspective
Perspective -> Perspective -> [Perspective]
Perspective -> Perspective -> Perspective -> [Perspective]
(Perspective -> Perspective)
-> (Perspective -> Perspective)
-> (Int -> Perspective)
-> (Perspective -> Int)
-> (Perspective -> [Perspective])
-> (Perspective -> Perspective -> [Perspective])
-> (Perspective -> Perspective -> [Perspective])
-> (Perspective -> Perspective -> Perspective -> [Perspective])
-> Enum Perspective
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Perspective -> Perspective
succ :: Perspective -> Perspective
$cpred :: Perspective -> Perspective
pred :: Perspective -> Perspective
$ctoEnum :: Int -> Perspective
toEnum :: Int -> Perspective
$cfromEnum :: Perspective -> Int
fromEnum :: Perspective -> Int
$cenumFrom :: Perspective -> [Perspective]
enumFrom :: Perspective -> [Perspective]
$cenumFromThen :: Perspective -> Perspective -> [Perspective]
enumFromThen :: Perspective -> Perspective -> [Perspective]
$cenumFromTo :: Perspective -> Perspective -> [Perspective]
enumFromTo :: Perspective -> Perspective -> [Perspective]
$cenumFromThenTo :: Perspective -> Perspective -> Perspective -> [Perspective]
enumFromThenTo :: Perspective -> Perspective -> Perspective -> [Perspective]
Enum,Perspective
Perspective -> Perspective -> Bounded Perspective
forall a. a -> a -> Bounded a
$cminBound :: Perspective
minBound :: Perspective
$cmaxBound :: Perspective
maxBound :: Perspective
Bounded)

type instance Dual Projective = Injective
type instance Dual Injective = Projective

type instance ToSite Projective = To
type instance ToSite Injective  = From

--------------------------------------------------------------------------------

-- ToPerspective -


-- | mapping to 'Perspective'-

type family ToPerspective (t :: k) :: Perspective


type instance  ToPerspective To   = Projective
type instance  ToPerspective From = Injective