﻿`` func MakeU1(h, w, c) := Range(h * w * c)->CastU1()->Tensor.From(h, w, c);
`` func U4(n, s) := ((n + 1) band 0xFF) shl s;
`` func MakeU4(h, w) := (Range(h * w) * 4)->ForEach(as a, (U4(a, 0) bor U4(a+1, 8) bor U4(a+2, 16) bor U4(a+3, 24))->CastU4())->Tensor.From(h, w);

With(t:MakeU1( 1,  1, 4), r:t->ResizePixels( 2), (t, r))
With(t:MakeU1( 3,  2, 4), r:t->ResizePixels( 6), (t, r))
With(t:MakeU1( 3,  2, 4), r:t->ResizePixels( 2), (t, r))
With(t:MakeU1( 2,  3, 4), r:t->ResizePixels( 2), (t, r))
With(t:MakeU1(10, 20, 4), r:t->ResizePixels( 5), (t, r))
With(t:MakeU1( 0, 20, 4), r:t->ResizePixels( 0), (t, r))
With(t:MakeU1(10,  0, 4), r:t->ResizePixels(10), (t, r))
// REVIEW: Make this one work!
With(t:MakeU1(10, 20, 3), r:t->ResizePixels( 5), (t, r))

With(t:MakeU4( 1,  1), r:t->ResizePixels( 2), (t, r))
With(t:MakeU4( 3,  2), r:t->ResizePixels( 6), (t, r))
With(t:MakeU4(10, 20), r:t->ResizePixels( 5), (t, r))
With(t:MakeU4( 0, 20), r:t->ResizePixels( 0), (t, r))
With(t:MakeU4(10,  0), r:t->ResizePixels(10), (t, r))

With(t:MakeU1( 1,  1, 4), r:t->ResizePixels( 2,  1), (t, r))
With(t:MakeU1( 3,  2, 4), r:t->ResizePixels( 6,  2), (t, r))
With(t:MakeU1(10, 20, 4), r:t->ResizePixels( 5,  5), (t, r))
With(t:MakeU1( 0, 20, 4), r:t->ResizePixels(10,  0), (t, r))
With(t:MakeU1(10,  0, 4), r:t->ResizePixels( 0, 10), (t, r))
// REVIEW: Make this one work!
With(t:MakeU1(10, 20, 3), r:t->ResizePixels( 5, 5), (t, r))

With(t:MakeU4( 1,  1), r:t->ResizePixels( 2,  1), (t, r))
With(t:MakeU4( 3,  2), r:t->ResizePixels( 6,  2), (t, r))
With(t:MakeU4(10, 20), r:t->ResizePixels( 5,  5), (t, r))
With(t:MakeU4( 0, 20), r:t->ResizePixels(10,  0), (t, r))
With(t:MakeU4(10,  0), r:t->ResizePixels( 0, 10), (t, r))

With(t:MakeU1( 3,  2, 4), r:t->ResizePixels( 3,  2), (t, r))
With(t:MakeU4( 3,  2), r:t->ResizePixels( 3,  2), (t, r))

// Not regular.
With(t:MakeU1(3, 2, 4)[::-1], r:t->ResizePixels(6), (t, r))

// Regular but delta != 1.
With(t:MakeU1(3, 2, 8)[:, :, ::2], r:t->ResizePixels(6), (t, r))

// Mapping based buffer.
With(t:Range(10 * 20)->CastU2()->Tensor.From(10, 20), r:t->ResizePixels(5), (t, r))

// Fails since count doesn't fit in i4.
With(t:Tensor.Fill(0xFFu1, 1_000_000_000, 1_000_000_000, 4), r:t->ResizePixels(5), (t, r))
With(t:Tensor.Fill(0xFFFFFFu4, 1_000_000_000, 1_000_000_000), r:t->ResizePixels(5), (t, r))

// Fails since height doesn't fit in i4.
With(t:Tensor.Fill(0xFFu1, 1_000_000_000_000, 10, 4), r:t->ResizePixels(5), (t, r))
With(t:Tensor.Fill(0xFFFFFFu4, 1_000_000_000_000, 10), r:t->ResizePixels(5), (t, r))

// Fails since width doesn't fit in i4.
With(t:Tensor.Fill(0xFFu1, 10, 1_000_000_000_000, 4), r:t->ResizePixels(5), (t, r))
With(t:Tensor.Fill(0xFFFFFFu4, 10, 1_000_000_000_000), r:t->ResizePixels(5), (t, r))

// Failures.
MakeU1(1, 1, 4)->ResizePixels(-1, 2)
MakeU4(1, 1)->ResizePixels(-1, 2)
MakeU1(1, 1, 4)->ResizePixels(1, 1_000_000_000_000)
MakeU4(1, 1)->ResizePixels(1, 1_000_000_000_000)

Tensor.Fill(0xFFu1, 1, 1_000_000, 4)->ResizePixels(1_000_000)
Tensor.Fill(0xFFu1, 1_000_000, 1, 4)->ResizePixels(1_000_000)
