    {-# LANGUAGE FlexibleContexts #-}
    {-# LANGUAGE TypeFamilies     #-}

    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Diagrams.ThreeD.Size
    -- Copyright   :  (c) 2014 diagrams-lib team (see LICENSE)
    -- License     :  BSD-style (see LICENSE)
    -- Maintainer  :  diagrams-discuss@googlegroups.com
    --
    -- Utilities for working with sizes of three-dimensional objects.
    --
    -----------------------------------------------------------------------------
    module Diagrams.ThreeD.Size
           (
             -- ** Computing sizes
             extentX, extentY, extentZ

             -- ** Specifying sizes
           , mkSizeSpec3D
           , dims3D

           ) where

    import           Diagrams.Core
    import           Diagrams.Core.Envelope
    import           Diagrams.Size
    import           Diagrams.TwoD.Size
    import           Diagrams.ThreeD.Types
    import           Diagrams.ThreeD.Vector

    ------------------------------------------------------------
    -- Computing diagram sizes
    ------------------------------------------------------------

    -- | Compute the absolute z-coordinate range of an enveloped object in
    --   the form @(lo,hi)@. Return @Nothing@ for objects with an empty
    --   envelope.
    extentZ :: (InSpace v n a, R3 v, Enveloped a) => a -> Maybe (n, n)
    extentZ = extent unitZ

    -- | Make a 'SizeSpec' from possibly-specified width and height.
    mkSizeSpec3D :: Num n => Maybe n -> Maybe n -> Maybe n -> SizeSpec V3 n
    mkSizeSpec3D x y z = mkSizeSpec (V3 x y z)

    -- | Make a 'SizeSpec' from a width and height.
    dims3D :: n -> n -> n -> SizeSpec V3 n
    dims3D x y z = dims (V3 x y z)