packages feed

egison-3.2.22: lib/core/number.egi

;;;;;
;;;;;
;;;;; Number Library
;;;;;
;;;;;

;;;
;;; Integers
;;;
(define $integer buildin-data-matcher)

(define $min
  (lambda [$ns]
    (match ns (list integer)
      {[<cons $n <nil>> n]
       [<cons $n $rs>
        (let {[$r (min rs)]}
          (match (compare-integer n r) ordering
            {[<less> n]
             [_ r]}))]})))

(define $max
  (lambda [$ns]
    (match ns (list integer)
      {[<cons $n <nil>> n]
       [<cons $n $rs>
        (let {[$r (max rs)]}
          (match (compare-integer n r) ordering
            {[<greater> n]
             [_ r]}))]})))

(define $min-and-max
  (lambda [$ns]
    (match ns (list integer)
      {[<cons $n <nil>> [n n]]
       [<cons $n $rs>
        (let {[[$min-n $max-n] (min-and-max rs)]}
          (match (compare-integer n min-n) ordering
            {[<less> [n max-n]]
             [_ (match (compare-integer n max-n) ordering
                  {[<greater> [min-n n]]
                   [_ [min-n max-n]]})]}))]})))

(define $power
  (lambda [$x $n]
    (foldl * 1 (take n (repeat1 x)))))

(define $mod
  (lambda [$m]
    (matcher
      {[,$n []
        {[$tgt (if (eq? (modulo tgt m) (modulo n m))
                   {[]}
                   {})]}]
       [$ [something]
        {[$tgt {tgt}]}]
       })))

(define $even?
  (lambda [$n]
    (eq? 0 (modulo n 2))))

(define $odd?
  (lambda [$n]
    (eq? 1 (modulo n 2))))

(define $between?
  (lambda [$m $n $x]
    (and (lte? m x) (lte? x n))))

;;
;; Float Numbers
;;
(define $float buildin-data-matcher)