factor/basis/mirrors/mirrors.factor

70 lines
1.9 KiB
Factor
Raw Normal View History

2008-02-21 02:26:44 -05:00
! Copyright (C) 2007, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2013-04-22 14:48:26 -04:00
USING: accessors arrays assocs byte-arrays classes
classes.tuple classes.tuple.private combinators fry hashtables
kernel math quotations sequences slots slots.private strings
vectors ;
2007-09-20 18:09:08 -04:00
IN: mirrors
TUPLE: mirror { object read-only } ;
2007-09-20 18:09:08 -04:00
C: <mirror> mirror
2011-10-24 07:47:42 -04:00
: object-slots ( mirror -- slots ) object>> class-of all-slots ; inline
2007-09-20 18:09:08 -04:00
M: mirror at*
[ nip object>> ] [ object-slots slot-named ] 2bi
2008-04-24 03:48:48 -04:00
dup [ offset>> slot t ] [ 2drop f f ] if ;
2007-09-20 18:09:08 -04:00
2008-08-29 02:59:25 -04:00
ERROR: no-such-slot slot ;
ERROR: read-only-slot slot ;
: check-set-slot ( val slot -- val offset )
{
2008-08-29 02:59:25 -04:00
{ [ dup not ] [ no-such-slot ] }
{ [ dup read-only>> ] [ read-only-slot ] }
2008-06-30 02:44:58 -04:00
{ [ 2dup class>> instance? not ] [ class>> bad-slot-value ] }
[ offset>> ]
} cond ; inline
2007-09-20 18:09:08 -04:00
M: mirror set-at ( val key mirror -- )
[ object-slots slot-named check-set-slot ] [ object>> ] bi
swap set-slot ;
2007-09-20 18:09:08 -04:00
M: mirror delete-at ( key mirror -- )
2008-12-22 06:41:01 -05:00
[ f ] 2dip set-at ;
2007-09-20 18:09:08 -04:00
M: mirror clear-assoc ( mirror -- )
2013-04-22 14:48:26 -04:00
[ object-slots ] [ object>> ] bi '[
[ initial>> ] [ offset>> _ swap set-slot ] bi
] each ;
2007-09-20 18:09:08 -04:00
M: mirror >alist ( mirror -- alist )
2013-04-22 14:48:26 -04:00
[ object-slots ] [ object>> ] bi '[
[ name>> ] [ offset>> _ swap slot ] bi
] { } map>assoc ;
2007-09-20 18:09:08 -04:00
2013-04-07 15:51:35 -04:00
M: mirror keys ( mirror -- keys )
object-slots [ name>> ] map ;
M: mirror values ( mirror -- values )
2013-04-22 14:48:26 -04:00
[ object-slots ] [ object>> ] bi
'[ offset>> _ swap slot ] map ;
2013-04-07 15:51:35 -04:00
M: mirror assoc-size
object>> class-of class-size ;
2007-09-20 18:09:08 -04:00
INSTANCE: mirror assoc
MIXIN: inspected-sequence
INSTANCE: array inspected-sequence
INSTANCE: vector inspected-sequence
INSTANCE: callable inspected-sequence
INSTANCE: byte-array inspected-sequence
2007-09-20 18:09:08 -04:00
GENERIC: make-mirror ( obj -- assoc )
2008-06-27 01:48:05 -04:00
M: hashtable make-mirror ;
2007-09-20 18:09:08 -04:00
M: integer make-mirror drop f ;
M: inspected-sequence make-mirror <enum> ;
2007-09-20 18:09:08 -04:00
M: object make-mirror <mirror> ;