-- | Compound data structures from sec. 7.9 of PDF32000:2008

module Pdf.Core.Types
(
  Rectangle(..),
  rectangleFromArray
)
where

import Pdf.Core
import Pdf.Core.Util
import Pdf.Core.Object.Util

import qualified Data.Vector as Vector

-- | Rectangle
data Rectangle a = Rectangle a a a a
  deriving Int -> Rectangle a -> ShowS
[Rectangle a] -> ShowS
Rectangle a -> String
(Int -> Rectangle a -> ShowS)
-> (Rectangle a -> String)
-> ([Rectangle a] -> ShowS)
-> Show (Rectangle a)
forall a. Show a => Int -> Rectangle a -> ShowS
forall a. Show a => [Rectangle a] -> ShowS
forall a. Show a => Rectangle a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Rectangle a] -> ShowS
$cshowList :: forall a. Show a => [Rectangle a] -> ShowS
show :: Rectangle a -> String
$cshow :: forall a. Show a => Rectangle a -> String
showsPrec :: Int -> Rectangle a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Rectangle a -> ShowS
Show

-- | Create rectangle form an array of 4 numbers
rectangleFromArray :: Array -> Either String (Rectangle Double)
rectangleFromArray :: Array -> Either String (Rectangle Double)
rectangleFromArray Array
arr = do
  [Double]
res <- (Object -> Maybe Double) -> [Object] -> Maybe [Double]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Object -> Maybe Double
realValue (Array -> [Object]
forall a. Vector a -> [a]
Vector.toList Array
arr)
      Maybe [Double] -> String -> Either String [Double]
forall a. Maybe a -> String -> Either String a
`notice` String
"Rectangle should contain real values"
  case [Double]
res of
    [Double
a, Double
b, Double
c, Double
d] -> Rectangle Double -> Either String (Rectangle Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Rectangle Double -> Either String (Rectangle Double))
-> Rectangle Double -> Either String (Rectangle Double)
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double -> Double -> Rectangle Double
forall a. a -> a -> a -> a -> Rectangle a
Rectangle Double
a Double
b Double
c Double
d
    [Double]
_ -> String -> Either String (Rectangle Double)
forall a b. a -> Either a b
Left (String
"rectangleFromArray: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Array -> String
forall a. Show a => a -> String
show Array
arr)