functional pe(a)rls: huey's zipper
DESCRIPTION
2014 edition of the Functional Pe(a)rls series, this time on purely functional Zippers with Moo, and self-balancing AA trees.TRANSCRIPT
![Page 1: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/1.jpg)
FUNCTIONAL PE(A)RLSYAPC::EU::2014 София
@osfameron
Huey’s Zipper
http://marinaneira.deviantart.com/art/Huey-Duck-317018337
![Page 2: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/2.jpg)
FUNCTIONAL PE(A)RLS WORLD TOUR
IPW 2008, Pisa map/grep, lazy iterators, currying, Devel::Declar for pretty syntax, Concurrency (Acme::Fork::Lazy)
LPW 2008, London much of above, Monad tutorial, Devel::Declare, Imperative programming in Pure Perl!
NWE.pm May 2009, Manchester as above, possibly also pattern matching?
YAPC::EU 2009, Lisbon functions, operators, Devel::Declare, sections, partial application, Sub::Curried, composition
IPW 2011, Turin purely functional data structures, linked lists,
http://www.slideshare.net/osfameron/
![Page 3: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/3.jpg)
https://www.flickr.com/photos/qiaomeng/5540694558/
![Page 4: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/4.jpg)
https://www.flickr.com/photos/hoyvinmayvin/4686704193/
![Page 5: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/5.jpg)
IN THE BLUE CORNER…
Mutable
my $x = 10;
…
$x = 20;
Immutable
my $x = 10;
…
my $x2 = 20;
![Page 6: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/6.jpg)
AND IN THE RED CORNER…
Mutable
sub c2f {my $temp=shift;$temp *= 9;$temp /= 5;$temp += 32;return $temp;
}
Immutable
sub c2f {my $c=shift;my $t1 = $c * 9;my $t2 = $t1 / 5;my $f = $t2 + 32;return $f;
}
![Page 7: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/7.jpg)
AND IN THE RED CORNER… (redux)
Mutable
sub c2f {my $temp=shift;$temp *= 9/5;$temp += 32;return $temp;
}
Immutable
sub c2f {my $c = shift;return (
($c * 9/5)+ 32
)}
![Page 8: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/8.jpg)
https://www.flickr.com/photos/redvers/532076662/
![Page 9: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/9.jpg)
MUTABLE… CONSTANTS?
1 = 2;
say 1 + 1; # 4
![Page 10: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/10.jpg)
ACTION AT A DISTANCE
my $one = 1;
…
sub bad_mutation {$one++;
}
sub naïve_expectations {say $one + $one; # 2? Or 4, 6, 10, etc.?
}
![Page 11: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/11.jpg)
CONSTANTS
use constant ONE => 1;
…
sub on_the_defensive {say ONE + ONE; # 2
}
![Page 12: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/12.jpg)
https://www.flickr.com/photos/jans_world/8985026701/
![Page 13: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/13.jpg)
IMMUTABLE DATA STRUCTURES…
my $users = { … };
my $users_with_addresses = frobnicate($users);
send_emails($users_with_addresses);
sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out
}
![Page 14: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/14.jpg)
IMMUTABLE DATA STRUCTURES…
my $users = { … };
my $users_with_addresses = frobnicate($users);
send_emails($users_with_addresses);
sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out
}
![Page 15: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/15.jpg)
IMMUTABLE DATA STRUCTURES…
my $users = { … };
my $users_with_addresses = frobnicate($users);
send_emails($users_with_addresses);
sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out
}
![Page 16: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/16.jpg)
https://www.flickr.com/photos/light_seeker/7571188852/
![Page 17: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/17.jpg)
READONLY VARIABLES
use Const::Fast;
sub wibble {const my $in => shift;const my $out => $in * 2;return $out;
}
![Page 18: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/18.jpg)
READONLY VARIABLES
const my %hash => (foo => {
bar => 1}
);
$hash{foo}{bar} = 2; # tee hee hee
![Page 19: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/19.jpg)
READONLY VARIABLES
const my %hash => (foo => {
bar => 1}
);
$hash{foo}{bar} = 2;
# Modification of a read-only value attempted
![Page 20: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/20.jpg)
COPIES OF VARIABLES?
Mutable
sub c2f {my $temp=shift;$temp *= 9;$temp /= 5;$temp += 32;return $temp;
}
Immutable
sub c2f {my $c=shift;my $t1 = $c * 9;my $t2 = $t1 / 5;my $f = $t2 + 32;return $f;
}
![Page 21: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/21.jpg)
https://www.flickr.com/photos/historiska/13619294395
![Page 22: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/22.jpg)
CREATURE COMFORTS
package Creature;
use Moo;
use Types::Standard ‘:all’;
has name => ( is => ‘ro’, isa => Str );
has type => ( is => ‘ro’, isa => Str );
has height => ( is => ‘ro’, isa => Num );
![Page 23: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/23.jpg)
IF IT QUACKS LIKE A DUCK
use Creature;
my $donald = Creature->new(name => ‘Donald’,type => ‘duck’,height => 50, # cm
);
![Page 24: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/24.jpg)
RESEARCH
http://wiki.answers.com/Q/How_tall_is_Donald_duck
![Page 25: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/25.jpg)
RESEARCH
https://www.google.co.uk/search?q=2+feet+in+cm
![Page 26: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/26.jpg)
LET’S JUST CHANGE THAT THEN, OH…
$donald->height( 60.96 );
![Page 27: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/27.jpg)
CREATURE COMFORTS
package Creature;
use Moo;
use Types::Standard ‘:all’;
has name => ( is => ‘ro’, isa => Str );
has type => ( is => ‘ro’, isa => Str );
has height => ( is => ‘ro’, isa => Num );
![Page 28: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/28.jpg)
CHAINED COPY…
# using MooseX::Attribute::ChainedClone
my $donald2 = $donald->height( 60.96 );
![Page 29: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/29.jpg)
![Page 30: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/30.jpg)
![Page 31: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/31.jpg)
https://www.flickr.com/photos/dps/7161557/
![Page 32: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/32.jpg)
CHAINED COPY…
# using MooseX::Attribute::ChainedClone
my $donald2 = $donald->height( 60.96 );
![Page 33: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/33.jpg)
MooX::But
package MooX::But;
use Moo::Role;
sub but {
my $self = shift;
return $self->new(%$self, @_);
}
# see https://github.com/haarg/MooX-CloneWith
![Page 34: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/34.jpg)
CHAINED COPY…
my $donald2 = $donald->but( height => 60.96 );
![Page 35: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/35.jpg)
https://www.flickr.com/photos/randar/10337132166/
![Page 36: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/36.jpg)
I’LL BE A MONKEY’S UNCLE
package Creature;
use Moo;
use Types::Standard ‘:all’;
has name => ( is => ‘ro’, isa => Str );
has type => ( is => ‘ro’, isa => Str );
has height => ( is => ‘ro’, isa => Num );
has uncle => ( is => ‘ro’,isa => InstanceOf[‘Creature’] );
![Page 37: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/37.jpg)
![Page 38: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/38.jpg)
COMPLEX CHAINED COPIES…
Mutable
$donald->uncle->height(52);
Immutable
$donald->uncle->but(height => 52
);
![Page 39: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/39.jpg)
COMPLEX CHAINED COPIES…
Mutable
$donald->uncle->height(52);
Immutable
my … = $donald->uncle->but(height => 52
);
![Page 40: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/40.jpg)
![Page 41: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/41.jpg)
![Page 42: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/42.jpg)
![Page 43: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/43.jpg)
COMPLEX CHAINED COPIES…
my $donald2 = $donald->but(uncle => $donald->uncle->but(
height => 52)
);
![Page 44: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/44.jpg)
https://www.flickr.com/photos/81583603@N00/4099146279/
![Page 45: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/45.jpg)
![Page 46: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/46.jpg)
EVEN MOAR COMPLEX CHAINED COPIES…
my $huey = $huey->but(uncle => $huey->uncle->but(
uncle => $huey->uncle->uncle->but(height => 52,
))
);
![Page 47: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/47.jpg)
https://en.wikipedia.org/wiki/Clan_McDuck#Family_tree
![Page 48: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/48.jpg)
http://pixdaus.com/super-squirrel-squirrel/items/view/97702/
![Page 49: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/49.jpg)
THE ZIPPER
my $zipper = $huey->zip;
![Page 50: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/50.jpg)
![Page 51: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/51.jpg)
![Page 52: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/52.jpg)
THE ZIPPER
my $zipper = $huey->zip->go(‘uncle’);
![Page 53: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/53.jpg)
![Page 54: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/54.jpg)
THE ZIPPER
my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’);
![Page 55: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/55.jpg)
![Page 56: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/56.jpg)
https://www.flickr.com/photos/nics_events/2349632625/
![Page 57: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/57.jpg)
MODIFYING “IN-PLACE”
my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 );
![Page 58: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/58.jpg)
![Page 59: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/59.jpg)
BACK UP THE ZIPPER
my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up;
![Page 60: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/60.jpg)
![Page 61: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/61.jpg)
BACK UP THE ZIPPER
my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up;
![Page 62: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/62.jpg)
![Page 63: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/63.jpg)
https://www.flickr.com/photos/123755251@N04/13969035991
![Page 64: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/64.jpg)
UNZIPPING
my $huey2 = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up->unzip;
![Page 65: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/65.jpg)
![Page 66: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/66.jpg)
![Page 67: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/67.jpg)
UNZIPPING
my $huey2 = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up->unzip;
![Page 68: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/68.jpg)
UNZIPPING
my $huey2 = $huey->zip->dive(‘uncle’, ‘uncle’)->set( height => 51 )->unzip;
![Page 69: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/69.jpg)
UNZIPPING
my $huey2 = $huey->doZipper( sub { $_->dive(‘uncle’, ‘uncle’)->set( height => 51 ) } );
![Page 70: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/70.jpg)
REMATCH
Mutable
$huey->uncle->uncle->height(51);
Immutable
my $huey2 = $huey->doZipper(sub {
$_->uncle->uncle->set(height=>51)
});
![Page 71: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/71.jpg)
REMATCH
Mutable
$huey->uncle->uncle->height(51);
Immutable
my $huey2 = $huey->doZipper(sub {
$_->uncle->uncle->set(height=>51)
});
![Page 72: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/72.jpg)
https://www.flickr.com/photos/phunk/1460508385/
![Page 73: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/73.jpg)
https://www.flickr.com/photos/mukumbura/3845329580/
![Page 74: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/74.jpg)
![Page 75: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/75.jpg)
![Page 76: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/76.jpg)
https://www.flickr.com/photos/93081182@N02/12853918764/
![Page 77: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/77.jpg)
![Page 78: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/78.jpg)
![Page 79: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/79.jpg)
![Page 80: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/80.jpg)
![Page 81: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/81.jpg)
![Page 82: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/82.jpg)
https://www.flickr.com/photos/intherough/3470183543/
![Page 83: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/83.jpg)
![Page 84: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/84.jpg)
![Page 85: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/85.jpg)
![Page 86: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/86.jpg)
https://www.flickr.com/photos/ruthanddave/1760267748/
![Page 87: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/87.jpg)
RED BLACK TREES
https://en.wikipedia.org/wiki/Red%E2%80%93black_tree
![Page 88: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/88.jpg)
![Page 89: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/89.jpg)
![Page 90: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/90.jpg)
https://www.flickr.com/photos/bunnyrel/3970251151/
![Page 91: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/91.jpg)
![Page 92: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/92.jpg)
TYPICAL RED-BLACK TREE CASES
https://en.wikipedia.org/wiki/AA_tree
![Page 93: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/93.jpg)
![Page 94: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/94.jpg)
http://www.quickmeme.com/Engineering-Professor/page/43/
![Page 95: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/95.jpg)
AA TREE CASES
https://en.wikipedia.org/wiki/AA_tree
![Page 96: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/96.jpg)
https://www.flickr.com/photos/wwarby/7127632463/
![Page 97: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/97.jpg)
BALANCING ROTATIONS
Skew Split
![Page 98: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/98.jpg)
ZIPPER WITHIN AA-TREE CODE
# split
return $R->but(
left => $self->but(
right => $R->left,
),
level => $R->level + 1,
);
![Page 99: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/99.jpg)
ZIPPER WITHIN AA-TREE CODE
# split
return $R->but(
left => $self->but(
right => $R->left,
),
level => $R->level + 1,
);
![Page 100: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/100.jpg)
ZIPPER WITHIN AA-TREE CODE
# split
return $R->zip
->set( level => $R->level + 1)
->left->set( right => $R->left )
->unzip;
![Page 101: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/101.jpg)
ZIPPER WITHIN AA-TREE CODE
# split
return $R->zip
->inc(‘level’)
->left->set( right => $R->left )
->unzip;
![Page 102: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/102.jpg)
https://www.flickr.com/photos/jimmiehomeschoolmom/5066802611
![Page 103: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/103.jpg)
ZIPPER WITHIN AA-TREE CODE
# in delete
$tree = $tree->zip
->set( level => $min_level )
->right->set( level => $min_level2 )
->top->skew->right->skew->right->skew
->top->split->right->split
->unzip;
![Page 104: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/104.jpg)
ZIPPER WITHIN AA-TREE CODE
# in delete
$tree = $tree->zip
->set( level => $min_level )
->right->set( level => $min_level2 )
->top->skew->right->skew->right->skew
->top->split->right->split
->unzip;
![Page 105: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/105.jpg)
ZIPPER WITHIN AA-TREE CODE
# in delete
$tree = $tree->zip
->set( level => $min_level )
->go(‘right’)->set( level => $min_level2 )
->top->skew->go(‘right’)->skew->go (‘right’)->skew
->top->split->go(‘right’)->split
->unzip;
![Page 106: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/106.jpg)
ZIPPER WITHIN AA-TREE CODE
# in delete
$tree = $tree->zip
->set( level => $min_level )
->right->set( level => $min_level2 )
->top->skew->right->skew->right->skew
->top->split->right->split
->unzip;
![Page 107: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/107.jpg)
![Page 108: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/108.jpg)
![Page 109: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/109.jpg)
LendingMemo.com - https://www.flickr.com/photos/lendingmemo/11702093735/
![Page 110: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/110.jpg)
![Page 111: Functional pe(a)rls: Huey's zipper](https://reader034.vdocument.in/reader034/viewer/2022042714/54b1d5784a79591a3c8b45d8/html5/thumbnails/111.jpg)
https://www.flickr.com/photos/wwworks/4759535950/