Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Sketch out SubsetHOW. Untested.
  • Loading branch information
jnthn committed Jun 14, 2011
1 parent b2e9a57 commit 692a140
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Perl6/Metamodel/EXPORTHOW.pm
Expand Up @@ -11,4 +11,5 @@ my module EXPORTHOW {
($?PACKAGE.WHO)<role-group> := Perl6::Metamodel::ParametricRoleGroupHOW;
($?PACKAGE.WHO)<role-curried> := Perl6::Metamodel::CurriedRoleHOW;
($?PACKAGE.WHO)<native> := Perl6::Metamodel::NativeHOW;
($?PACKAGE.WHO)<subset> := Perl6::Metamodel::SubsetHOW;
}
37 changes: 37 additions & 0 deletions src/Perl6/Metamodel/SubsetHOW.pm
@@ -1,4 +1,41 @@
class Perl6::Metamodel::SubsetHOW
does Perl6::Metamodel::Naming
{
# The subset type or nominal type that we refine.
has $!refinee;

# The block implementing the refinement.
has $!refinement;

method new_type(:$name = '<anon>', :$refinee!, :$refinement!) {
my $metasubset := self.new(:name($name), :refinee($refinee),
:refinement($refinement));
my $type := pir::repr_type_object_for__PPS($metasubset, 'Uninstantiable');
pir::stable_set_type_check_mode__0PI($type, 2)
}

method set_of($obj, $refinee) {
$!refinee := $refinee
}

method refinee($obj) {
$!refinee
}

method refinement($obj) {
$!refinement
}

# Do check when we're on LHS of smartmatch (e.g. Even ~~ Int).
method type_check($obj, $checkee) {
pir::perl6_booleanize__PI($checkee.HOW =:= self ||
pir::type_check__IPP($checkee, $!refinee))
}

# Here we check the value itself (when on RHS on smartmatch).
method accepts_type($obj, $checkee) {
pir::perl6_booleanize__PI(
pir::type_check__IPP($checkee, $!refinee) &&
$!refinement.ACCEPTS($checkee))
}
}
1 change: 1 addition & 0 deletions src/core/EXPORTHOW.pm
Expand Up @@ -12,4 +12,5 @@ my module EXPORTHOW {
pir::set__vQsPP($?PACKAGE.WHO, Q:PIR{ %r = box 'role-group' }, Perl6::Metamodel::ParametricRoleGroupHOW);
pir::set__vQsPP($?PACKAGE.WHO, Q:PIR{ %r = box 'role-curried' }, Perl6::Metamodel::CurriedRoleHOW);
pir::set__vQsPP($?PACKAGE.WHO, Q:PIR{ %r = box 'native' }, Perl6::Metamodel::NativeHOW);
pir::set__vQsPP($?PACKAGE.WHO, Q:PIR{ %r = box 'subset' }, Perl6::Metamodel::SubsetHOW);
}
1 change: 1 addition & 0 deletions tools/build/Makefile.in
Expand Up @@ -102,6 +102,7 @@ METAMODEL_SOURCES = \
src/Perl6/Metamodel/RoleToClassApplier.pm \
src/Perl6/Metamodel/ClassHOW.pm \
src/Perl6/Metamodel/NativeHOW.pm \
src/Perl6/Metamodel/SubsetHOW.pm \
src/Perl6/Metamodel/ContainerDescriptor.pm \
src/Perl6/Metamodel/BOOTSTRAP.pm \
src/Perl6/Metamodel/EXPORTHOW.pm \
Expand Down

0 comments on commit 692a140

Please sign in to comment.