factor/basis/models/models.factor

121 lines
3.0 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-07-04 18:58:37 -04:00
USING: accessors generic kernel math sequences arrays assocs
calendar math.order continuations fry ;
2007-09-20 18:09:08 -04:00
IN: models
TUPLE: model < identity-tuple
value connections dependencies ref locked? ;
2007-09-20 18:09:08 -04:00
2008-07-04 18:58:37 -04:00
: new-model ( value class -- model )
new
swap >>value
V{ } clone >>connections
V{ } clone >>dependencies
0 >>ref ; inline
2007-09-20 18:09:08 -04:00
: <model> ( value -- model )
2008-07-04 18:58:37 -04:00
model new-model ;
2007-09-20 18:09:08 -04:00
: add-dependency ( dep model -- )
2008-08-29 17:03:37 -04:00
dependencies>> push ;
2007-09-20 18:09:08 -04:00
: remove-dependency ( dep model -- )
2009-10-28 00:25:35 -04:00
dependencies>> remove! drop ;
2007-09-20 18:09:08 -04:00
DEFER: add-connection
GENERIC: model-activated ( model -- )
M: model model-activated drop ;
: ref-model ( model -- n )
[ 1 + ] change-ref ref>> ;
2007-09-20 18:09:08 -04:00
: unref-model ( model -- n )
[ 1 - ] change-ref ref>> ;
2007-09-20 18:09:08 -04:00
: activate-model ( model -- )
dup ref-model 1 = [
2008-08-29 17:03:37 -04:00
dup dependencies>>
2007-09-20 18:09:08 -04:00
[ dup activate-model dupd add-connection ] each
model-activated
] [
drop
] if ;
DEFER: remove-connection
: deactivate-model ( model -- )
dup unref-model zero? [
2008-08-29 17:03:37 -04:00
dup dependencies>>
2008-01-09 17:36:30 -05:00
[ dup deactivate-model remove-connection ] with each
2007-09-20 18:09:08 -04:00
] [
drop
] if ;
GENERIC: model-changed ( model observer -- )
2007-09-20 18:09:08 -04:00
: add-connection ( observer model -- )
2008-08-29 17:03:37 -04:00
dup connections>> empty? [ dup activate-model ] when
connections>> push ;
2007-09-20 18:09:08 -04:00
: remove-connection ( observer model -- )
2009-10-28 00:25:35 -04:00
[ connections>> remove! drop ] keep
2008-08-29 17:03:37 -04:00
dup connections>> empty? [ dup deactivate-model ] when
2007-09-20 18:09:08 -04:00
drop ;
: with-locked-model ( model quot -- )
2009-02-26 03:59:29 -05:00
[ '[ _ t >>locked? @ ] ]
[ drop '[ _ f >>locked? drop ] ]
2bi [ ] cleanup ; inline
2007-09-20 18:09:08 -04:00
GENERIC: update-model ( model -- )
M: model update-model drop ;
: notify-connections ( model -- )
2008-08-29 17:03:37 -04:00
dup connections>> [ model-changed ] with each ;
: set-model ( value model -- )
2008-08-29 17:03:37 -04:00
dup locked?>> [
2drop
] [
2009-02-26 03:59:29 -05:00
[
2008-08-29 17:03:37 -04:00
swap >>value
[ update-model ] [ notify-connections ] bi
] with-locked-model
] if ;
2007-09-20 18:09:08 -04:00
: ((change-model)) ( model quot -- newvalue model )
2008-12-03 09:46:16 -05:00
over [ [ value>> ] dip call ] dip ; inline
2007-09-20 18:09:08 -04:00
: change-model ( ..a model quot: ( ..a obj -- ..b newobj ) -- ..b )
2007-09-20 18:09:08 -04:00
((change-model)) set-model ; inline
: (change-model) ( ..a model quot: ( ..a obj -- ..b newobj ) -- ..b )
((change-model)) value<< ; inline
2007-09-20 18:09:08 -04:00
GENERIC: range-value ( model -- value )
GENERIC: range-page-value ( model -- value )
GENERIC: range-min-value ( model -- value )
GENERIC: range-max-value ( model -- value )
GENERIC: range-max-value* ( model -- value )
GENERIC: set-range-value ( value model -- )
GENERIC: set-range-page-value ( value model -- )
GENERIC: set-range-min-value ( value model -- )
GENERIC: set-range-max-value ( value model -- )
: clamp-value ( value range -- newvalue )
[ range-min-value ] [ range-max-value* ] bi clamp ;
: change-model* ( ..a model quot: ( ..a obj -- ..b ) -- ..b )
'[ _ keep ] change-model ; inline
: push-model ( value model -- )
[ push ] change-model* ;
: pop-model ( model -- value )
[ pop ] change-model* ;