{-# LANGUAGE TemplateHaskell  #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE UndecidableInstances  #-}
{-# LANGUAGE DeriveAnyClass  #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Geometry.Box( module Data.Geometry.Box.Internal
                        , topSide, leftSide, bottomSide, rightSide
                        , sides, sides'
                        ) where
import Control.DeepSeq
import Data.Geometry.Box.Internal
import Data.Geometry.LineSegment
import Data.Geometry.Vector
deriving instance (NFData p, NFData r, Arity d) => NFData (Box d p r)
topSide :: Num r => Rectangle p r -> LineSegment 2 p r
topSide = (\(l,r,_,_) -> ClosedLineSegment l r) . corners
bottomSide :: Num r => Rectangle p r -> LineSegment 2 p r
bottomSide = (\(_,_,r,l) -> ClosedLineSegment l r) . corners
leftSide  :: Num r => Rectangle p r -> LineSegment 2 p r
leftSide = (\(t,_,_,b) -> ClosedLineSegment b t) . corners
rightSide :: Num r => Rectangle p r -> LineSegment 2 p r
rightSide = (\(_,t,b,_) -> ClosedLineSegment b t) . corners
sides :: Num r => Rectangle p r -> ( LineSegment 2 p r
                                   , LineSegment 2 p r
                                   , LineSegment 2 p r
                                   , LineSegment 2 p r
                                   )
sides = (\(t,r,b,l) -> (t,flipSegment r,flipSegment b,l)) . sides'
sides'   :: Num r => Rectangle p r -> ( LineSegment 2 p r
                                      , LineSegment 2 p r
                                      , LineSegment 2 p r
                                      , LineSegment 2 p r
                                      )
sides' r = (topSide r, rightSide r, bottomSide r, leftSide r)