#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Kronecker_product_based_fractals
#

func kronecker_product (a, b) { a ~X b -> map { _[0] ~X* _[1] } }

func kronecker_fractal(pattern, order=4) {
    var kronecker = pattern
    { kronecker = kronecker_product(kronecker, pattern) } * order
    return kronecker
}

var order = 5
var shape = [[1, 1, 1], [0, 1, 0], [0, 1, 0]]

require("Imager")

var pat = kronecker_fractal(shape, order)
var img = %O<Imager>.new(xsize => pat[0].len, ysize => pat.len)
for x,y in (^pat[0].len ~X ^pat.len) {
    img.setpixel(x => x, y => y, color => (pat[y][x] ? <255 255 32> : <16 16 16>))
}

img.write(file => "kronecker_fractal.png")