packages feed

koneko-0.0.2: src/Koneko/Math.hs

--  --                                                          ; {{{1
--
--  File        : Koneko/Math.hs
--  Maintainer  : Felix C. Stegerman <flx@obfusk.net>
--  Date        : 2020-02-02
--
--  Copyright   : Copyright (C) 2020  Felix C. Stegerman
--  Version     : v0.0.1
--  License     : GPLv3+
--
--  --                                                          ; }}}1

{-# LANGUAGE OverloadedStrings #-}

module Koneko.Math (initCtx) where

import Control.Exception (throwIO)
import Control.Monad (when)
import Data.Foldable (traverse_)

import Koneko.Data

initCtx :: Context -> IO ()
initCtx ctxMain = do
  ctx <- forkContext "math" ctxMain
  traverse_ (defPrim ctx) [
      mkBltn "sign" $ pop1push1 $ either (int . signum) (float . signum),
      pow, op2 "**" (**), mkBltn "pi" $ const $ flip rpush1 (pi :: Double),
      op1 "exp"   exp,    op1 "log"   log,    op1 "sqrt"  sqrt,
      op1 "sin"   sin,    op1 "cos"   cos,    op1 "tan"   tan,
      op1 "asin"  asin,   op1 "acos"  acos,   op1 "atan"  atan,
      op1 "sinh"  sinh,   op1 "cosh"  cosh,   op1 "tanh"  tanh,
      op1 "asinh" asinh,  op1 "acosh" acosh,  op1 "atanh" atanh,
      op2 "atan2" atan2
    ]

op1 :: Identifier -> (Double -> Double) -> Builtin
op1 name op = mkBltn name $ pop1push1 op

op2 :: Identifier -> (Double -> Double -> Double) -> Builtin
op2 name op = mkBltn name $ pop2push1 op

pow :: Builtin
pow = mkBltn "^" $ \_ s -> do
  ((x, y), s') <- pop2' s
  when (y < 0) $ throwIO $ RangeError "negative exponent"
  rpush1 s' $ (x :: Integer) ^ (y :: Integer)

-- vim: set tw=70 sw=2 sts=2 et fdm=marker :