1 ! Copyright (C) 2007, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs byte-arrays classes classes.tuple
4 classes.tuple.private combinators fry hash-sets hashtables kernel math
5 quotations sequences sets slots slots.private strings vectors ;
8 TUPLE: mirror { object read-only } ;
12 : object-slots ( mirror -- slots ) object>> class-of all-slots ; inline
15 [ nip object>> ] [ object-slots slot-named ] 2bi
16 [ offset>> slot t ] [ drop f f ] if* ;
18 ERROR: no-such-slot slot ;
19 ERROR: read-only-slot slot ;
21 : check-set-slot ( val slot -- val offset )
23 { [ dup not ] [ no-such-slot ] }
24 { [ dup read-only>> ] [ read-only-slot ] }
25 { [ 2dup class>> instance? not ] [ class>> bad-slot-value ] }
29 M: mirror set-at ( val key mirror -- )
30 [ object-slots slot-named check-set-slot ] [ object>> ] bi
33 M: mirror delete-at ( key mirror -- )
36 M: mirror clear-assoc ( mirror -- )
37 [ object-slots ] [ object>> ] bi '[
38 [ initial>> ] [ offset>> _ swap set-slot ] bi
41 M: mirror >alist ( mirror -- alist )
42 [ object-slots ] [ object>> ] bi '[
43 [ name>> ] [ offset>> _ swap slot ] bi
46 M: mirror keys ( mirror -- keys )
47 object-slots [ name>> ] map ;
49 M: mirror values ( mirror -- values )
50 [ object-slots ] [ object>> ] bi
51 '[ offset>> _ swap slot ] map ;
54 object>> class-of class-size ;
56 INSTANCE: mirror assoc
58 MIXIN: inspected-sequence
59 INSTANCE: array inspected-sequence
60 INSTANCE: vector inspected-sequence
61 INSTANCE: callable inspected-sequence
62 INSTANCE: byte-array inspected-sequence
63 INSTANCE: string inspected-sequence
65 GENERIC: make-mirror ( obj -- assoc )
66 M: hashtable make-mirror ;
67 M: hash-set make-mirror members make-mirror ;
68 M: integer make-mirror drop f ;
69 M: inspected-sequence make-mirror <enum> ;
70 M: object make-mirror <mirror> ;