factor/unmaintained/isequences/interface/interface.factor

111 lines
2.8 KiB
Factor

! Copyright (C) 2007 Robbert van Dalen.
! See http://factorcode.org/license.txt for BSD license.
IN: isequences.interface
USING: generic kernel ;
! Unifies sequences, integers and objects, following Enchilada semantics.
! Efficiency is achieved through lazy immutable size-balanced binary trees.
! - An object is an isequence of size 1 containing itself
! - An integer is an isequence of size itself containing zeros
! - If a sequence is never modified it is also considered an isequence
! - An isequence can have negative sign
GENERIC: -- ( s -- -s ) ! monadic negate
GENERIC: $$ ( s1 -- h ) ! monadic hash
GENERIC: ++ ( s1 s2 -- s ) ! dyadic concatenate
GENERIC: i-length ( s -- n ) ! monadic size
GENERIC: i-cmp ( s1 s2 -- n ) ! dyadic compare
GENERIC# i-at 1 ( s n -- v ) ! dyadic index
GENERIC# ihead 1 ( s n -- s ) ! dyadic head of a cut
GENERIC# itail 1 ( s n -- s ) ! dyadic tail of a cut
GENERIC: ileft ( s -- v ) ! balanced left side
GENERIC: iright ( s -- v ) ! balanced right side
GENERIC: ipair ( s1 s2 -- s ) ! pairing two isequences
GENERIC: ascending? ( s -- ? ) ! monadic ascending query
GENERIC: descending? ( s -- ? ) ! monadic descending query
GENERIC: left-side ( v -- v )
GENERIC: right-side ( v -- v )
GENERIC: left-side-empty? ( s -- ? )
GENERIC: right-side-empty? ( s -- ? )
GENERIC: :v: ( v -- v )
! **** lazy turn of an isequence
!
GENERIC: :: ( s -- ts )
! **** lazy reversal of an isequence
!
GENERIC: `` ( s -- rs )
! **** lazy right division of an isequence
!
GENERIC: _/ ( n s -- n/s )
! **** lazy left division of an isequence ****
!
GENERIC: /_ ( s1 n -- s1/n )
! **** full division of two isequences ****
!
: // ( s1 s2 -- n1/s2 s1/n2 ) 2dup /_ -rot _/ ; inline
! **** matching two isequences ****
!
GENERIC: >> ( s1 s2 -- s1/s2 )
! **** iota ****
!
GENERIC: ~~ ( s -- s )
! **** lazy maximum of two isequences
!
GENERIC: || ( s1 s2 -- max-s1-s2 )
! **** lazy minimum of two isequences ****
!
GENERIC: && ( s1 s2 -- min-s1-s2 )
! **** strict modulus of two isequences ****
!
GENERIC: %% ( s1 s2 -- ms1 ms2 )
! **** strict right product of an isequence ****
!
GENERIC: _* ( m s -- m*s )
! **** lazy left product of an isequence ****
!
GENERIC# *_ 1 ( s m -- s*m )
! **** full product of two isequences ****
!
: ** ( s1 s2 -- ms1 ms2 ) 2dup *_ -rot _* ; inline
! **** lazy left union ****
!
GENERIC: <_ ( n s -- n/s )
! **** lazy right diff ****
!
GENERIC: _< ( n s -- n/s )
! **** lazy union and diff of two isequences ****
!
: << ( s1 s2 -- u-s1-s2 d-s1-s2 ) 2dup <_ -rot _< ; inline
! **** lazy wiped isequence ****
!
GENERIC: ## ( s -- ws )