     (parse-ipv4) join-components ;
 
 : ipv4-ntoa ( integer -- ip )
-    $[ { -24 -16 -8 0 } [ [ 8 shift-mod ] curry ] map ] cleave
-    join-components ;
+    { -24 -16 -8 0 } [ 8 shift-mod ] with map join-components ;
 
 : ipv4-aton ( ip -- integer )
-    (parse-ipv4) [ 24 16 8 [ shift ] tri-curry@ tri* ] dip + + + ;
+    (parse-ipv4) { 24 16 8 0 } [ shift ] [ + ] 2map-reduce ;

! Copyright (C) 2012 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
USING: arrays combinators combinators.short-circuit
generalizations kernel literals locals math math.bitwise
math.parser sequences sequences.private splitting ;

IN: ip-parser


    [ rest "0o" prepend ] when ;

: split-components ( str -- array )
    "." split [ cleanup-octal string>number ] map ;

: bubble ( array -- newarray )
    reverse 0 swap [ + 256 /mod ] map reverse nip ;

: join-components ( array -- str )
    [ number>string ] map "." join ;

: (parse-ipv4) ( str -- array )
    dup split-components dup length {
        { 1 [ { 0 0 0 } prepend ] }
        { 2 [ 1 cut { 0 0 } glue ] }
        { 3 [ 2 cut { 0 } glue ] }
        { 4 [ ] }
        [ drop invalid-ipv4 ]
    } case bubble nip ; inline

PRIVATE>

