-- | Units related to the field of (classical) physics. Includes kinematics, forces, etc.
module Data.Drasil.Units.Physics where

import Data.Drasil.SI_Units (metre, radian, s_2, second, newton, kilogram,
  m_2, m_3, newton)
import Language.Drasil (cn, dcc, newUnit, UnitDefn, (/:), (/$), (*:), makeDerU)

accelU, angVelU, angAccelU, forcePerMeterU, momtInertU, momentOfForceU, 
 impulseU, springConstU, torqueU, velU :: UnitDefn

accelU :: UnitDefn
accelU          = String -> UnitEquation -> UnitDefn
newUnit String
"acceleration"         (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
metre UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
s_2
angVelU :: UnitDefn
angVelU         = String -> UnitEquation -> UnitDefn
newUnit String
"angular velocity"     (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
radian UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
second
angAccelU :: UnitDefn
angAccelU       = String -> UnitEquation -> UnitDefn
newUnit String
"angular acceleration" (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
radian UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
s_2
forcePerMeterU :: UnitDefn
forcePerMeterU  = String -> UnitEquation -> UnitDefn
newUnit String
"force per meter"      (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
newton UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
metre
impulseU :: UnitDefn
impulseU        = String -> UnitEquation -> UnitDefn
newUnit String
"impulse"              (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
newton UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
second
momtInertU :: UnitDefn
momtInertU      = String -> UnitEquation -> UnitDefn
newUnit String
"moment of inertia"    (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
kilogram UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
m_2
momentOfForceU :: UnitDefn
momentOfForceU  = String -> UnitEquation -> UnitDefn
newUnit String
"moment of force"      (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
newton UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
metre
springConstU :: UnitDefn
springConstU    = String -> UnitEquation -> UnitDefn
newUnit String
"spring constant"      (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
newton UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
metre
torqueU :: UnitDefn
torqueU         = String -> UnitEquation -> UnitDefn
newUnit String
"torque"               (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
newton UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
metre
velU :: UnitDefn
velU            = String -> UnitEquation -> UnitDefn
newUnit String
"velocity"             (UnitEquation -> UnitDefn) -> UnitEquation -> UnitDefn
forall a b. (a -> b) -> a -> b
$ UnitDefn
metre UnitDefn -> UnitDefn -> UnitEquation
/: UnitDefn
second

gravConstU :: UnitDefn

gravConstU :: UnitDefn
gravConstU = ConceptChunk -> UnitEquation -> UnitDefn
makeDerU (String -> NP -> String -> ConceptChunk
dcc String
"gravConstU" (String -> NP
cn String
"gravitational constant")
  String
"universal gravitational constant") (UnitDefn
m_3 UnitDefn -> UnitEquation -> UnitEquation
/$ (UnitDefn
kilogram UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
s_2))