-- | 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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "gravConstU" (String -> NP
cn "gravitational constant")
  "universal gravitational constant") (UnitDefn
m_3 UnitDefn -> UnitEquation -> UnitEquation
/$ (UnitDefn
kilogram UnitDefn -> UnitDefn -> UnitEquation
*: UnitDefn
s_2))