Perl-Sensitive Sunglasses PerlMonks

### Re: sorting and grouping by

by rg0now (Chaplain)
 on Mar 13, 2008 at 21:25 UTC ( #674076=note: print w/replies, xml ) Need Help??

in reply to sorting and grouping by

```type Data = (Int, Int, String)

bottom (b, _, _) = b
top    (_, t, _) = t
ide    (_, _, i) = i

contains :: Data -> Data -> Bool
x `contains` y = bottom x <= bottom y && top x >= top y

rangeSort1 :: [Data] -> [(Data, [Data])]
rangeSort1 r = map (\x -> (x, (filter (contains x) (filter (/=x) r))))
+  r

----

test :: [Data]
test = [ (11, 22, "A")
, (22, 45, "B")
, (22, 33, "C")
, (25, 28, "D")
, (47, 49, "E")
]
And here is the corresponding Perl, or at least, this is the closest I could get to this 'declarational' style in Perl:
```sub bottom { shift->[0] };
sub top    { shift->[1] };
sub ide    { shift->[2] };

sub contains { bottom(\$_[0]) <= bottom(\$_[1]) && top(\$_[0]) >= top(\$_[
+1]) };

sub rangeSort1 { map { my \$x = \$_;
[\$x, [grep {contains(\$x, \$_)}
(grep { ide(\$_) ne ide(\$x) } @_) ] ]
} @_ };

my \$test = [ [11, 22, "A"]
, [22, 45, "B"]
, [22, 33, "C"]
, [25, 28, "D"]
, [47, 49, "E"]
];
If there's a Haskell/Perl guru out there with some free time, could you please improve on this?

```rangeSort1 :: [Data] -> [(Data, [Data])]
rangeSort1 r = mapMaybe (\x -> let l = filter (contains x) . filter (/
+=x)
in case l r of
[]        -> Nothing
otherwise -> Just (x, l r)
)  r

Create A New User
Node Status?
node history
Node Type: note [id://674076]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (11)
As of 2018-05-24 14:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
World peace can best be achieved by:

Results (178 votes). Check out past polls.

Notices?