{-# LANGUAGE Unsafe, CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Data.Metrology.Unsafe -- Copyright : (C) 2013 Richard Eisenberg -- License : BSD-style (see LICENSE) -- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) -- Stability : experimental -- Portability : non-portable -- -- This module exports the constructor of the 'Qu' type. This allows you -- to write code that takes creates and reads quantities at will, -- which may lead to dimension unsafety. Use at your peril. -- -- This module also exports 'UnsafeQu', which is a simple wrapper around -- 'Qu' that has 'Functor', etc., instances. The reason 'Qu' itself doesn't -- have a 'Functor' instance is that it would be unit-unsafe, allowing you, -- say, to add 1 to a quantity.... but 1 what? That's the problem. However, -- a 'Functor' instance is likely useful, hence 'UnsafeQu'. ----------------------------------------------------------------------------- module Data.Metrology.Unsafe ( -- * The 'Qu' type Qu(..), -- * 'UnsafeQu' UnsafeQu(..) ) where import Data.Metrology.Qu #if __GLASGOW_HASKELL__ < 709 import Control.Applicative import Data.Foldable import Data.Traversable #endif -- | A basic wrapper around 'Qu' that has more instances. newtype UnsafeQu d l n = UnsafeQu { qu :: Qu d l n } instance Functor (UnsafeQu d l) where fmap f (UnsafeQu (Qu x)) = UnsafeQu (Qu (f x)) instance Applicative (UnsafeQu d l) where pure x = UnsafeQu (Qu x) UnsafeQu (Qu f) <*> UnsafeQu (Qu x) = UnsafeQu (Qu (f x)) instance Foldable (UnsafeQu d l) where foldMap f (UnsafeQu (Qu x)) = f x instance Traversable (UnsafeQu d l) where traverse f (UnsafeQu (Qu x)) = UnsafeQu . Qu <$> f x