packages feed

hgeometry-0.14: src/Data/Geometry/Directions.hs

--------------------------------------------------------------------------------
-- |
-- Module      :  Data.Geometry.Directions
-- Copyright   :  (C) Frank Staals
-- License     :  see the LICENSE file
-- Maintainer  :  Frank Staals
--
--------------------------------------------------------------------------------
module Data.Geometry.Directions( CardinalDirection(..)
                               -- , _North, _East, _South, _West
                               , oppositeDirection

                                , InterCardinalDirection(..)
                                -- , _NorthWest, _NorthEast, _SouthEast, _SouthWest

                                , interCardinalsOf
                                ) where

import Data.Util
import GHC.Generics (Generic)

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

-- | The four cardinal directions.
data CardinalDirection = North | East | South | West deriving (Show,Read,Eq,Ord,Enum,Bounded)
-- makePrisms ''CardinalDirection

--------------------------------------------------------------------------------
-- * Functions on Cardinal Directions

-- | Computes the direction opposite to the given one.
oppositeDirection :: CardinalDirection -> CardinalDirection
oppositeDirection = \case
  North -> South
  East  -> West
  South -> North
  West  -> East

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

-- | Intercardinal directions
data InterCardinalDirection = NorthWest | NorthEast | SouthEast | SouthWest
  deriving (Show,Read,Eq,Ord,Enum,Generic)
-- makePrisms ''InterCardinalDirection

--------------------------------------------------------------------------------
-- * Functions on InterCardinal Directions

-- | Get the two intercardinal directions, in increasing order,
-- corresponding to the cardinal direction.
interCardinalsOf :: CardinalDirection -> Two InterCardinalDirection
interCardinalsOf = \case
  North -> Two NorthWest NorthEast
  East  -> Two NorthEast SouthEast
  South -> Two SouthEast SouthWest
  West  -> Two SouthWest NorthWest