$p-positions: ( rl: relative, fx: fixed, ab: absolute, sk: sticky, st: static );
$p-sides: ( t: top, r: right, b: bottom, l: left );

$p-increments: ( 20, 25, 40, 50, 60, 75, 80, 100 );
$p-other: ( a: auto, i: inherit, 0: 0 );

$p-object: (
    nil: $p-other,
    pc: $p-increments,
);

$p-covers: (
    a: ( 0, 0, 0, 0 ),
    t: ( 0, 0, null, 0 ),
    r: ( 0, 0, 0, null ), 
    b: ( null, 0, 0, 0 ),
    l: ( 0, null, 0, 0 ),
    x: ( null, 0, null, 0 ),
    y: ( 0, null, 0, null ),
);

.p\: {
    @include isMap($p-positions) using ($key, $value) {
        position: #{$value};
    }
}

.cvr\: {
    @include isMap($p-covers) using ($key, $val) {
        $t: nth($val, 1);
        $r: nth($val, 2);
        $b: nth($val, 3);
        $l: nth($val, 4);
        @include position(null, $t, $r, $b, $l);
    }
}

@each $side, $declaration in $p-sides {
    .#{$side}\: {
        @include isProp($p-object) using ($func, $values) {
            @if type-of($values) == 'map' {
                @include isMap($values) using ($key, $size) {
                    #{$declaration}: call(get-function($func), $size);
                }
            } @else {
                @include isList($values) using ($size) {
                    #{$declaration}: call(get-function($func), $size);
                }
            }
        }
    }
}
