factor/extra/units/units.factor

103 lines
2.4 KiB
Factor
Raw Normal View History

2008-08-23 00:20:49 -04:00
USING: accessors arrays io kernel math namespaces splitting
prettyprint sequences sorting vectors words inverse summary
shuffle math.functions sets ;
2007-09-20 18:09:08 -04:00
IN: units
TUPLE: dimensioned value top bot ;
TUPLE: dimensions-not-equal ;
: dimensions-not-equal ( -- * )
\ dimensions-not-equal new throw ;
2007-09-20 18:09:08 -04:00
M: dimensions-not-equal summary drop "Dimensions do not match" ;
: remove-one ( seq obj -- seq )
1array split1 append ;
: 2remove-one ( seq seq obj -- seq seq )
2008-03-29 21:36:58 -04:00
[ remove-one ] curry bi@ ;
2007-09-20 18:09:08 -04:00
: symbolic-reduce ( seq seq -- seq seq )
2008-09-06 18:15:25 -04:00
2dup intersect
[ first 2remove-one symbolic-reduce ] unless-empty ;
2007-09-20 18:09:08 -04:00
: <dimensioned> ( n top bot -- obj )
symbolic-reduce
2008-03-29 21:36:58 -04:00
[ natural-sort ] bi@
dimensioned boa ;
2007-09-20 18:09:08 -04:00
: >dimensioned< ( d -- n top bot )
2009-11-05 16:34:31 -05:00
[ bot>> ] [ top>> ] [ value>> ] tri ;
2007-09-20 18:09:08 -04:00
2009-11-05 16:34:31 -05:00
\ <dimensioned> [ [ dimensioned boa ] undo ] define-inverse
2007-09-20 18:09:08 -04:00
: dimensions ( dimensioned -- top bot )
2008-08-27 17:24:04 -04:00
[ top>> ] [ bot>> ] bi ;
2007-09-20 18:09:08 -04:00
: check-dimensions ( d d -- )
2008-03-29 21:36:58 -04:00
[ dimensions 2array ] bi@ =
2007-09-20 18:09:08 -04:00
[ dimensions-not-equal ] unless ;
2008-08-30 22:58:26 -04:00
: 2values ( dim dim -- val val ) [ value>> ] bi@ ;
2007-09-20 18:09:08 -04:00
: <dimension-op ( dim dim -- top bot val val )
2007-09-20 18:09:08 -04:00
2dup check-dimensions dup dimensions 2swap 2values ;
: dimension-op> ( top bot val -- dim )
2007-09-20 18:09:08 -04:00
-rot <dimensioned> ;
: d+ ( d d -- d ) <dimension-op + dimension-op> ;
: d- ( d d -- d ) <dimension-op - dimension-op> ;
: scalar ( n -- d )
{ } { } <dimensioned> ;
: d* ( d d -- d )
2008-03-29 21:36:58 -04:00
[ dup number? [ scalar ] when ] bi@
2008-08-30 22:58:26 -04:00
[ [ top>> ] bi@ append ] 2keep
[ [ bot>> ] bi@ append ] 2keep
2007-09-20 18:09:08 -04:00
2values * dimension-op> ;
: d-neg ( d -- d ) -1 d* ;
: d-sq ( d -- d ) dup d* ;
: d-recip ( d -- d' )
2009-11-05 16:34:31 -05:00
>dimensioned< recip dimension-op> ;
2007-09-20 18:09:08 -04:00
: d/ ( d d -- d ) d-recip d* ;
: comparison-op ( d d -- n n ) 2dup check-dimensions 2values ;
: d< ( d d -- ? ) comparison-op < ;
: d<= ( d d -- ? ) comparison-op <= ;
: d> ( d d -- ? ) comparison-op > ;
: d>= ( d d -- ? ) comparison-op >= ;
: d= ( d d -- ? ) comparison-op number= ;
2008-12-14 01:41:30 -05:00
: d~ ( d d delta -- ? ) [ comparison-op ] dip ~ ;
2007-09-20 18:09:08 -04:00
: d-min ( d d -- d ) [ d< ] most ;
: d-max ( d d -- d ) [ d> ] most ;
: d-product ( v -- d ) 1 scalar [ d* ] reduce ;
: d-sum ( v -- d ) unclip-slice [ d+ ] reduce ;
: d-infimum ( v -- d ) unclip-slice [ d-min ] reduce ;
: d-supremum ( v -- d ) unclip-slice [ d-max ] reduce ;
2008-03-29 16:18:46 -04:00
\ d+ [ d- ] [ d- ] define-math-inverse
\ d- [ d+ ] [ d- ] define-math-inverse
\ d* [ d/ ] [ d/ ] define-math-inverse
\ d/ [ d* ] [ d/ ] define-math-inverse
\ d-recip [ d-recip ] define-inverse