#! list.
2dup member? [ nip ] [ cons ] ifte ;
-M: general-list reversed ( list -- list )
+M: general-list reverse-slice ( list -- list )
[ ] [ swons ] reduce ;
-M: general-list reverse reversed ;
+M: general-list reverse reverse-slice ;
IN: sequences
DEFER: <range>
: fiber? ( seq quot -- ? | quot: elt elt -- ? )
#! Tests if all elements are equivalent under the relation.
over empty?
- [ >r [ first ] keep r> all-with? ] [ 2drop t ] ifte ; inline
+ [ 2drop t ] [ >r [ first ] keep r> all-with? ] ifte ; inline
! Operations
M: object thaw clone ;
: >pop> ( stack -- stack ) dup pop drop ;
-M: object reversed ( seq -- seq ) <reversed> ;
+M: object reverse-slice ( seq -- seq ) <reversed> ;
M: object reverse ( seq -- seq ) [ <reversed> ] keep like ;
GENERIC: thaw ( seq -- mutable-seq )
GENERIC: like ( seq seq -- seq )
GENERIC: reverse ( seq -- seq )
-GENERIC: reversed ( seq -- seq )
+GENERIC: reverse-slice ( seq -- seq )
GENERIC: peek ( seq -- elt )
GENERIC: head ( n seq -- seq )
GENERIC: tail ( n seq -- seq )
[ [ [ 3 2 1 ] [ 5 4 3 ] [ 6 ] ] ]
[ [ 1 2 3 ] [ 3 4 5 ] [ 6 ] 3list [ reverse ] map ] unit-test
-[ [ 43 "a" [ ] ] ] [ [ "a" 43 43 43 [ ] 43 "a" [ ] ] prune ] unit-test
+[ [ "a" 43 [ ] ] ] [ [ "a" 43 43 43 [ ] 43 "a" [ ] ] prune ] unit-test
[ "fdsfs" [ > ] sort ] unit-test-fails
[ [ ] ] [ [ ] [ > ] sort ] unit-test
USE: lists
USE: namespaces
USE: test
+USE: sequences
: cons@ [ cons ] change ;
: unique@ [ unique ] change ;
"crashes" "sbuf" "threads" "parsing-word"
"inference" "interpreter"
"alien"
- "line-editor" "gadgets/rectangles" "memory" "redefine"
- "annotate" "sequences" "binary" "inspector"
+ "gadgets/line-editor" "gadgets/rectangles" "memory"
+ "redefine" "annotate" "sequences" "binary" "inspector"
] run-tests ;
: benchmarks
! A gadget is a shape, a paint, a mapping of gestures to
! actions, and a reference to the gadget's parent. A gadget
! delegates to its shape.
-TUPLE: gadget paint gestures relayout? root? parent children ;
+TUPLE: gadget
+ paint gestures visible? relayout? root?
+ parent children ;
: gadget-child gadget-children first ;
C: gadget ( -- gadget )
- { 0 0 0 } dup <rectangle> over set-delegate ;
+ { 0 0 0 } dup <rectangle> over set-delegate
+ t over set-gadget-visible? ;
TUPLE: plain-gadget ;
prettyprint sdl sequences vectors ;
: (pick-up) ( point gadget -- gadget )
- gadget-children reversed [ inside? ] find-with nip ;
+ gadget-children reverse-slice [ inside? ] find-with nip ;
: pick-up ( point gadget -- gadget )
#! The logic is thus. If the point is definately outside the
#! box, return f. Otherwise, see if the point is contained
#! in any subgadget. If not, see if it is contained in the
#! box delegate.
- 2dup inside? [
+ dup gadget-visible? >r 2dup inside? r> drop [
[ translate ] keep 2dup
(pick-up) [ pick-up ] [ nip ] ?ifte
] [
[ remove-gadget ] [ 2drop ] ifte
] when* ;
+: (clear-gadget) ( gadget -- )
+ gadget-children [
+ dup [ f swap set-gadget-parent ] each 0 swap set-length
+ ] when* ;
+
: clear-gadget ( gadget -- )
- dup gadget-children [ f swap set-gadget-parent ] each
- 0 over gadget-children set-length relayout ;
+ dup (clear-gadget) relayout ;
: ?push ( elt seq/f -- seq )
[ [ push ] keep ] [ 1vector ] ifte* ;
prefer-incremental ;
: clear-incremental ( incremental -- )
- dup clear-gadget { 0 0 0 } swap set-incremental-cursor ;
+ dup (clear-gadget) { 0 0 0 } swap set-incremental-cursor ;
: with-clip ( shape quot -- )
#! All drawing done inside the quotation is clipped to the
- #! shape's bounds. The quotation is called with a boolean
- #! that is set to false if the gadget is entirely clipped.
+ #! shape's bounds.
[
>r screen-bounds clip [ intersect dup ] change set-clip
- r> call
+ [ r> call ] [ r> 2drop ] ifte
] with-scope ; inline
GENERIC: draw-gadget* ( gadget -- )
: draw-gadget ( gadget -- )
- dup [
- [
+ dup gadget-visible? [
+ dup [
dup draw-gadget* dup [
gadget-children [ draw-gadget ] each
] with-trans
- ] [ drop ] ifte
- ] with-clip ;
+ ] with-clip
+ ] [ drop ] ifte ;
M: gadget draw-gadget* ( gadget -- ) drop ;
! A viewport can be scrolled.
-TUPLE: viewport origin ;
+TUPLE: viewport origin bottom? ;
-: viewport-dim ( viewport -- h ) gadget-child pref-dim ;
+: viewport-dim gadget-child pref-dim ;
: fix-scroll ( origin viewport -- origin )
dup shape-dim swap viewport-dim v- vmax { 0 0 0 } vmin ;
M: viewport pref-dim gadget-child pref-dim ;
+: viewport-origin* ( viewport -- point )
+ dup viewport-bottom? [
+ f over set-viewport-bottom?
+ dup viewport-dim { 0 -1 0 } v* over fix-scroll
+ [ swap set-viewport-origin ] keep
+ ] [
+ viewport-origin
+ ] ifte ;
+
M: viewport layout* ( viewport -- )
- dup viewport-origin
- swap gadget-child dup prefer set-shape-loc ;
+ dup gadget-child dup prefer
+ >r viewport-origin* r> set-shape-loc ;
M: viewport focusable-child* ( viewport -- gadget )
gadget-child ;
slider-viewport visible-portion v/ ;
: slider-current ( slider -- pos )
- dup slider-viewport viewport-origin
+ dup slider-viewport viewport-origin*
dup rot slider-vector v* v- ;
: slider-pos ( slider pos -- pos )
: <y-slider> ( viewport -- slider ) { 0 1 0 } <slider> ;
: thumb-loc ( slider -- loc )
- dup slider-viewport viewport-origin vneg swap >thumb ;
+ dup slider-viewport viewport-origin* vneg swap >thumb ;
: slider-dim { 16 16 16 } ;
: add-y-slider 2dup set-scroller-y add-right ;
-: viewport>bottom ( -- viewport )
- dup viewport-origin over viewport-dim vneg
- { 0 1 0 } set-axis swap scroll ;
-
: (scroll>bottom) ( scroller -- )
- dup scroller-viewport viewport>bottom
+ t over scroller-viewport set-viewport-bottom?
dup scroller-x relayout scroller-y relayout ;
: scroll>bottom ( gadget -- )