Skip to content

Commit

Permalink
Merge pull request #158 from lizmat/deleteadverbkvpkv
Browse files Browse the repository at this point in the history
Support for subscript adverb :delete in combination with :kv :p :k :v
  • Loading branch information
lizmat committed Jun 2, 2013
2 parents 9cf3a88 + d292900 commit 12b13e5
Showing 1 changed file with 75 additions and 14 deletions.
89 changes: 75 additions & 14 deletions src/core/Any.pm
Expand Up @@ -329,10 +329,30 @@ my class Any {
multi method postcircumfix:<{ }>(\SELF: $key, Mu :$BIND! is parcel) is rw { multi method postcircumfix:<{ }>(\SELF: $key, Mu :$BIND! is parcel) is rw {
SELF.bind_key($key, $BIND) SELF.bind_key($key, $BIND)
} }
multi method postcircumfix:<{ }>(\SELF: $key, :$delete! where so $delete) is rw { multi method postcircumfix:<{ }>(
SELF.delete($key) \SELF: $key,
} :$delete! where so $delete,
multi method postcircumfix:<{ }>(\SELF: $key, :$exists!) is rw { :$kv = $default, :$p = $default, :$k = $default, :$v = $default
) is rw {
$p & $k & $kv & $v === $default # :delete only
?? SELF.delete($key) !!
$kv !=== $default
?? ( !$kv | SELF.exists($key)
?? ( $key, SELF.delete($key) )
!! () ) !!
$p !=== $default
?? ( !$p | SELF.exists($key)
?? RWPAIR($key, SELF.delete($key))
!! () ) !!
$k !=== $default
?? ( !$k | SELF.exists($key)
?? ( SELF.delete($key); $key )
!! () ) !!
!$v | SELF.exists($key)
?? SELF.delete($key)
!! ();
}
multi method postcircumfix:<{ }>(\SELF: $key, :$exists! ) is rw {
!( SELF.exists($key) ?^ $exists ) !( SELF.exists($key) ?^ $exists )
} }
multi method postcircumfix:<{ }>(\SELF: $key, :$p!) is rw { multi method postcircumfix:<{ }>(\SELF: $key, :$p!) is rw {
Expand All @@ -355,10 +375,47 @@ my class Any {
X::Bind::Slice.new(type => self.WHAT).throw X::Bind::Slice.new(type => self.WHAT).throw
} }
multi method postcircumfix:<{ }>( multi method postcircumfix:<{ }>(
\SELF: Positional \key, :$delete! where so $delete ) is rw { \SELF: Positional \key,
nqp::iscont(key) :$delete! where so $delete,
?? SELF.delete(key) :$kv = $default, :$p = $default, :$k = $default, :$v = $default
!! key.map({ SELF.delete($_) }).eager.Parcel ) is rw {

# handle single key immediately
return SELF{key}:$delete:$kv:$p:$k:$v if nqp::iscont(key);

$kv & $p & $k & $v === $default # :delete only
?? key.map({ SELF.delete($_) }).eager.Parcel !!
$kv !=== $default
?? ( $kv
?? key.map( {
SELF.exists($_) ?? ( $_, SELF.delete($_) ) !! ()
} ).eager.Parcel
!! key.map( {
( $_, SELF.delete($_) )
} ).eager.Parcel ) !!
$p !=== $default
?? ( $p
?? key.map( {
SELF.exists($_) ?? RWPAIR($_, SELF.delete($_)) !! ()
} ).eager.Parcel
!! key.map( {
RWPAIR($_, SELF.delete($_))
} ).eager.Parcel ) !!
$k !=== $default
?? ( $k
?? key.map( {
SELF.exists($_) ?? ( SELF.delete($_); $_ ) !! ()
} ).eager.Parcel
!! key.map( {
SELF.delete($_); $_
} ).eager.Parcel ) !!
$v
?? key.map( {
SELF.exists($_) ?? SELF.delete($_) !! ()
} ).eager.Parcel
!! key.map( {
SELF.delete($_)
} ).eager.Parcel;
} }
multi method postcircumfix:<{ }>( multi method postcircumfix:<{ }>(
\SELF: Positional \key, :$exists!) is rw { \SELF: Positional \key, :$exists!) is rw {
Expand Down Expand Up @@ -394,23 +451,27 @@ my class Any {
multi method postcircumfix:<{ }>(Whatever, :$BIND!) is rw { multi method postcircumfix:<{ }>(Whatever, :$BIND!) is rw {
X::Bind::Slice.new(type => self.WHAT).throw X::Bind::Slice.new(type => self.WHAT).throw
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$delete!) is rw { multi method postcircumfix:<{ }>(
SELF{SELF.keys}:$delete \SELF: Whatever,
:$delete! where so $delete,
:$kv = $default, :$p = $default, :$k = $default, :$v = $default
) is rw {
SELF{SELF.keys}:$delete:$kv:$p:$k:$v;
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$exists!) is rw { multi method postcircumfix:<{ }>(\SELF: Whatever, :$exists!) is rw {
SELF{SELF.keys}:$exists SELF{SELF.keys}:$exists
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$p!) is rw { multi method postcircumfix:<{ }>(\SELF: Whatever, :$p!) is rw {
SELF{SELF.keys}:p SELF{SELF.keys}:$p
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$kv!) is rw { multi method postcircumfix:<{ }>(\SELF: Whatever, :$kv!) is rw {
SELF{SELF.keys}:kv SELF{SELF.keys}:$kv
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$k!) is rw { multi method postcircumfix:<{ }>(\SELF: Whatever, :$k!) is rw {
SELF{SELF.keys}:k SELF{SELF.keys}:$k
} }
multi method postcircumfix:<{ }>(\SELF: Whatever, :$v!) is rw { multi method postcircumfix:<{ }>(\SELF: Whatever, :$v!) is rw {
SELF{SELF.keys}:v SELF{SELF.keys}:$v
} }


proto method at_key(|) { * } proto method at_key(|) { * }
Expand Down

0 comments on commit 12b13e5

Please sign in to comment.