Aion

 view release on metacpan or  search on metacpan

lib/Aion/Types.md  view on Meta::CPAN


# SYNOPSIS

```perl
use Aion::Types;

BEGIN {
	subtype SpeakOfKitty => as StrMatch[qr/\bkitty\b/i],
		message { "Speak is'nt included kitty!" };
}

"Kitty!" ~~ SpeakOfKitty # -> 1
"abc"    ~~ SpeakOfKitty # -> ""

SpeakOfKitty->validate("abc", "This") # @-> Speak is'nt included kitty!


BEGIN {
	subtype 'IntOrArrayRef[len, B]',
		as Int & Range[5, A]
			| ArrayRef[B & Len[A]];
}

35 ~~ IntOrArrayRef[35, Tel] # -> 1
35 ~~ IntOrArrayRef[34, Tel] # -> ""

'+23456789'  ~~ Tel # -> 1
'+234567890' ~~ Tel # -> 1
'+23456789'  ~~ (Tel & Len[9]) # -> 1
'+234567890' ~~ (Tel & Len[9]) # -> ""

['+23456789',  '+23456789'] ~~ IntOrArrayRef[9, Tel] # -> 1
['+234567890', '+23456789'] ~~ IntOrArrayRef[9, Tel] # -> ""

"" ~~ IntOrArrayRef[8, Tel]  # -> ""


coerce IntOrArrayRef[35, Str], from Num, via { int($_ + .5) };

IntOrArrayRef([35, Str])->coerce(5.5) # => 6

5.5 >> IntOrArrayRef[35, Str] # => 6

(Tel & Len[9]) < (Tel & Len[10]) # => 1
```

# DESCRIPTION

Этот модуль экспортирует подпрограммы:

* `subtype`, `as`, `init_where`, `where`, `awhere`, `message` — для создания валидаторов.
* `SELF`, `ARGS`, `A`, `B`, `C`, `D`, `M`, `N` — для использования в валидаторах типа и его аргументов.
* `coerce`, `from`, `via` — для создания конвертора значений из одного класса в другой.

Иерархия валидаторов:

```text
Any
	Control
		Union[A, B...]
		Intersection[A, B...]
		Exclude[A...]
		Option[A]
		Wantarray[A, B]
	Item
		External[type]
		Bool
		BoolLike
		Enum[e...]
		Maybe[A]
		Undef
		Defined
			Value
				Version
				Str
					Uni
					Bin
					NonEmptyStr
					StartsWith[start]
					EndsWith[end]
					Email
					Tel
					Url
					Path
					Html
					StrDate
					StrDateTime
					StrMatch[regexp]
					PackageName
						ClassName
						RoleName
					Join[separator]
					Split[separator]
					StrRat
					Num
						PositiveNum
						Int
							PositiveInt
							Nat
			Ref
				Tied`[class]
				LValueRef
				FormatRef
				CodeRef
					NamedCode[subname]
					ProtoCode[prototype]
					ForwardRef
					ImplementRef
					Isa[A...]
				RegexpRef
				ValueRef`[A]
					ScalarRef`[A]
					RefRef`[A]
				GlobRef
					FileHandle
				ArrayRef`[A]
					Tuple[A...]
					CycleTuple[A...]
				HashRef`[A]
					Map[A => B]
					Dict[k => A, ...]

lib/Aion/Types.md  view on Meta::CPAN


# Bool from Any — 1 or ""
Bool->coerce([]) # -> 1
Bool->coerce(0)  # -> ""
```

## from ($type)

Синтаксический сахар для `coerce`.

## via ($code)

Синтаксический сахар для `coerce`.

# ATTRIBUTES

## :Isa (@signature)

Проверяет сигнатуру подпрограммы: аргументы и результаты.

```perl
sub minint($$) : Isa(Int => Int => Int) {
	my ($x, $y) = @_;
	$x < $y? $x : $y
}

minint 6, 5; # -> 5
eval {minint 5.5, 2}; $@ # ~> Arguments of method `minint` must have the type Tuple\[Int, Int\]\.

sub half($) : Isa(Int => Int) {
	my ($x) = @_;
	$x / 2
}

half 4; # -> 2
eval {half 5}; $@ # ~> Return of method `half` must have the type Int. The it is 2.5
```

# TYPES

## Any

Тип верхнего уровня в иерархии. Сопоставляет всё.

Нижний тип можно получить как `~Any`.

## Control

Тип верхнего уровня в конструкторах иерархии создает новые типы из любых типов.

## Union[A, B...]

Союз нескольких типов. Аналогичен оператору `$type1 | $type2`.

```perl
33  ~~ Union[Int, Ref] # -> 1
[]  ~~ Union[Int, Ref] # -> 1
"a" ~~ Union[Int, Ref] # -> ""
```

## Intersection[A, B...]

Пересечение нескольких типов. Аналогичен оператору `$type1 & $type2`.

```perl
15 ~~ Intersection[Int, StrMatch[/5/]] # -> 1
```

## Exclude[A]

Исключение значения типа. Аналогичен оператору `~ $type`.

```perl
-5  ~~ Exclude[PositiveInt] # -> 1
"a" ~~ Exclude[PositiveInt] # -> 1
5   ~~ Exclude[PositiveInt] # -> ""
5.5 ~~ Exclude[PositiveInt] # -> 1
```

## Option[A]

Дополнительные ключи в `Dict`.

```perl
{a=>55} ~~ Dict[a=>Int, b => Option[Int]]          # -> 1
{a=>55, b=>31} ~~ Dict[a=>Int, b => Option[Int]]   # -> 1
{a=>55, b=>31.5} ~~ Dict[a=>Int, b => Option[Int]] # -> ""
```

## Wantarray[A, S]

Если подпрограмма возвращает разные значения в контексте массива и скаляра, то используется тип `Wantarray` с типом `A` для контекста массива Ð...

```perl
sub arr : Isa(PositiveInt => Wantarray[ArrayRef[PositiveInt], PositiveInt]) {
	my ($n) = @_;
	wantarray? 1 .. $n: $n
}

my @array = arr(3);
my $scalar = arr(3);

\@array # --> [1,2,3]
$scalar  # -> 3
```

## Item

Тип верхнего уровня в иерархии скалярных типов.

## External[type]

Правращает `type` в `Aion::Type`.

* Если `type` - `Aion::Type`, то возвращает его без изменений.
* Если `type` строка, то оборачивает его в `Object`.
* Если `type` можно вызвать, то оборачивает его в `Aion::Type->new(test => $type, ...)`. А если он имеет метод `coerce`, то будет его использовать для преобразован...

```perl
External['Aion'] # -> Object['Aion']
External[sub { /^x/ }] ~~ 'xyz' # -> 1

package MyInt {
	use overload "&{}" => sub {
		sub { /^[+-]?[0-9]+$/ }
	};



( run in 0.654 second using v1.01-cache-2.11-cpan-995e09ba956 )