{-
	Copyright (C) 2021 Dr. Alistair Ward

	This file is part of BishBosh.

	BishBosh is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	BishBosh is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@]

	* Describes the direction of a rank of the board.
-}

module BishBosh.Direction.Horizontal(
-- * Types
-- ** Data-types
	Horizontal(),
-- * Constants
--	range,
	nHorizontals
) where

import qualified	BishBosh.Property.FixedMembership	as Property.FixedMembership
import qualified	BishBosh.Property.Opposable		as Property.Opposable
import qualified	BishBosh.Property.Reflectable		as Property.Reflectable
import qualified	BishBosh.Type.Count			as Type.Count

-- | The sum-type of orientations of all lines of constant rank.
data Horizontal	= W | E deriving (Int -> Horizontal
Horizontal -> Int
Horizontal -> [Horizontal]
Horizontal -> Horizontal
Horizontal -> Horizontal -> [Horizontal]
Horizontal -> Horizontal -> Horizontal -> [Horizontal]
(Horizontal -> Horizontal)
-> (Horizontal -> Horizontal)
-> (Int -> Horizontal)
-> (Horizontal -> Int)
-> (Horizontal -> [Horizontal])
-> (Horizontal -> Horizontal -> [Horizontal])
-> (Horizontal -> Horizontal -> [Horizontal])
-> (Horizontal -> Horizontal -> Horizontal -> [Horizontal])
-> Enum Horizontal
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Horizontal -> Horizontal -> Horizontal -> [Horizontal]
$cenumFromThenTo :: Horizontal -> Horizontal -> Horizontal -> [Horizontal]
enumFromTo :: Horizontal -> Horizontal -> [Horizontal]
$cenumFromTo :: Horizontal -> Horizontal -> [Horizontal]
enumFromThen :: Horizontal -> Horizontal -> [Horizontal]
$cenumFromThen :: Horizontal -> Horizontal -> [Horizontal]
enumFrom :: Horizontal -> [Horizontal]
$cenumFrom :: Horizontal -> [Horizontal]
fromEnum :: Horizontal -> Int
$cfromEnum :: Horizontal -> Int
toEnum :: Int -> Horizontal
$ctoEnum :: Int -> Horizontal
pred :: Horizontal -> Horizontal
$cpred :: Horizontal -> Horizontal
succ :: Horizontal -> Horizontal
$csucc :: Horizontal -> Horizontal
Enum, Horizontal -> Horizontal -> Bool
(Horizontal -> Horizontal -> Bool)
-> (Horizontal -> Horizontal -> Bool) -> Eq Horizontal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Horizontal -> Horizontal -> Bool
$c/= :: Horizontal -> Horizontal -> Bool
== :: Horizontal -> Horizontal -> Bool
$c== :: Horizontal -> Horizontal -> Bool
Eq, Eq Horizontal
Eq Horizontal
-> (Horizontal -> Horizontal -> Ordering)
-> (Horizontal -> Horizontal -> Bool)
-> (Horizontal -> Horizontal -> Bool)
-> (Horizontal -> Horizontal -> Bool)
-> (Horizontal -> Horizontal -> Bool)
-> (Horizontal -> Horizontal -> Horizontal)
-> (Horizontal -> Horizontal -> Horizontal)
-> Ord Horizontal
Horizontal -> Horizontal -> Bool
Horizontal -> Horizontal -> Ordering
Horizontal -> Horizontal -> Horizontal
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
min :: Horizontal -> Horizontal -> Horizontal
$cmin :: Horizontal -> Horizontal -> Horizontal
max :: Horizontal -> Horizontal -> Horizontal
$cmax :: Horizontal -> Horizontal -> Horizontal
>= :: Horizontal -> Horizontal -> Bool
$c>= :: Horizontal -> Horizontal -> Bool
> :: Horizontal -> Horizontal -> Bool
$c> :: Horizontal -> Horizontal -> Bool
<= :: Horizontal -> Horizontal -> Bool
$c<= :: Horizontal -> Horizontal -> Bool
< :: Horizontal -> Horizontal -> Bool
$c< :: Horizontal -> Horizontal -> Bool
compare :: Horizontal -> Horizontal -> Ordering
$ccompare :: Horizontal -> Horizontal -> Ordering
$cp1Ord :: Eq Horizontal
Ord, Int -> Horizontal -> ShowS
[Horizontal] -> ShowS
Horizontal -> String
(Int -> Horizontal -> ShowS)
-> (Horizontal -> String)
-> ([Horizontal] -> ShowS)
-> Show Horizontal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Horizontal] -> ShowS
$cshowList :: [Horizontal] -> ShowS
show :: Horizontal -> String
$cshow :: Horizontal -> String
showsPrec :: Int -> Horizontal -> ShowS
$cshowsPrec :: Int -> Horizontal -> ShowS
Show)

instance Read Horizontal where
	readsPrec :: Int -> ReadS Horizontal
readsPrec Int
_ (Char
'W' : String
s)	= [(Horizontal
W, String
s)]
	readsPrec Int
_ (Char
'E' : String
s)	= [(Horizontal
E, String
s)]
	readsPrec Int
_ String
_		= []	-- No parse.

instance Property.FixedMembership.FixedMembership Horizontal where
	members :: [Horizontal]
members	= [Horizontal]
range

instance Property.Opposable.Opposable Horizontal where
	getOpposite :: Horizontal -> Horizontal
getOpposite Horizontal
W	= Horizontal
E
	getOpposite Horizontal
E	= Horizontal
W

instance Property.Reflectable.ReflectableOnY Horizontal where
	reflectOnY :: Horizontal -> Horizontal
reflectOnY	= Horizontal -> Horizontal
forall a. Opposable a => a -> a
Property.Opposable.getOpposite

-- | Constant range of values.
range :: [Horizontal]
range :: [Horizontal]
range	= [ Int -> Horizontal
forall a. Enum a => Int -> a
toEnum Int
0 .. ]

-- | The number of verticals directions.
nHorizontals :: Type.Count.NDirections
nHorizontals :: Int
nHorizontals	= Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ [Horizontal] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Horizontal]
range