{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}
-- | Types and functions for a corner radius
module Reflex.Dom.Widget.SVG.Types.CornerRadius
  ( CornerRadius
  , _CornerRadiusX
  , _CornerRadiusY
  ) where

import           Control.Lens                    (Iso', Rewrapped, Wrapped (..),
                                                  iso, _Wrapped)

import           Reflex.Dom.Widget.SVG.Types.Pos (X, Y)

-- | Corner Radius is effectively just a @Float@, but we can do better.
newtype CornerRadius p =
  CornerRadius Float
  deriving (Eq, Show)

instance (CornerRadius p) ~ t => Rewrapped (CornerRadius p) t

instance Wrapped (CornerRadius p) where
  type Unwrapped (CornerRadius p) = Float
  _Wrapped' = iso (\(CornerRadius x) -> x) CornerRadius

-- | @Iso@ for the CornerRadius on the X axis
_CornerRadiusX :: Iso' (CornerRadius X) Float
_CornerRadiusX = _Wrapped

-- | @Iso@ for the CornerRadius on the Y axis
_CornerRadiusY :: Iso' (CornerRadius Y) Float
_CornerRadiusY = _Wrapped