Brace expansion using ranges: Difference between revisions

Added Wren
(Added Wren)
Line 1,119:
alphanumeric mix{a..1}.txt ->
alphanumeric mix{a..1}.txt
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
Added a further example to test mixed number/alpha ranges which apparently are not expanded.
<lang ecmascript>import "/fmt" for Fmt
 
var parseRange = Fn.new { |r|
if (r == "") return ["{}"] // rangeless, empty
var sp = r.split("..")
if (sp.count == 1) return ["{%(r)}"] // rangeless, random value
var sta = sp[0]
var end = sp[1]
var inc = (sp.count == 2) ? "1" : sp[2]
var n1 = Num.fromString(sta)
var n2 = Num.fromString(end)
var n3 = Num.fromString(inc)
if (!n3) return ["{%(r)}"] // increment isn't a number
var numeric = n1 && n2
if (!numeric) {
if ((n1 && !n2) || (!n1 && n2)) return ["{%(r)}"] // mixed numeric/alpha not expanded
if (sta.count != 1 || end.count != 1) return ["{%(r)}"] // start/end are not both single alpha
n1 = sta.codePoints[0]
n2 = end.codePoints[0]
}
var width = 1
if (numeric) width = (sta.count < end.count) ? end.count : sta.count
if (n3 == 0) return (numeric) ? [Fmt.dz(width, n1)] : [sta] // zero increment
var res = []
var asc = n1 < n2
if (n3 < 0) {
asc = !asc
var t = n1
n1 = n2
n2 = t
n3 = -n3
}
var i = n1
if (asc) {
while (i <= n2) {
res.add( (numeric) ? Fmt.dz(width, i) : String.fromCodePoint(i) )
i = i + n3
}
} else {
while (i >= n2) {
res.add(( numeric) ? Fmt.dz(width, i) : String.fromCodePoint(i) )
i = i - n3
}
}
return res
}
 
var rangeExpand = Fn.new { |s|
var res = [""]
var rng = ""
var inRng = false
for (c in s) {
if (c == "{" && !inRng) {
inRng = true
rng = ""
} else if (c == "}" && inRng) {
var rngRes = parseRange.call(rng)
var rngCount = rngRes.count
var res2 = []
for (i in 0...res.count) {
for (j in 0...rngCount) res2.add(res[i] + rngRes[j])
}
res = res2
inRng = false
} else if (inRng) {
rng = rng + c
} else {
for (i in 0...res.count) res[i] = res[i] + c
}
}
if (inRng) for (i in 0...res.count) res[i] = res[i] + "{" + rng // unmatched braces
return res
}
 
var examples = [
"simpleNumberRising{1..3}.txt",
"simpleAlphaDescending-{Z..X}.txt",
"steppedDownAndPadded-{10..00..5}.txt",
"minusSignFlipsSequence {030..20..-5}.txt",
"combined-{Q..P}{2..1}.txt",
"emoji{🌵..🌶}{🌽..🌾}etc",
"li{teral",
"rangeless{}empty",
"rangeless{random}string",
"mixedNumberAlpha{5..k}"
]
 
for (s in examples) {
System.write("%(s) ->\n ")
var res = rangeExpand.call(s)
System.print(res.join("\n "))
System.print()
}</lang>
 
{{out}}
<pre>
simpleNumberRising{1..3}.txt ->
simpleNumberRising1.txt
simpleNumberRising2.txt
simpleNumberRising3.txt
 
simpleAlphaDescending-{Z..X}.txt ->
simpleAlphaDescending-Z.txt
simpleAlphaDescending-Y.txt
simpleAlphaDescending-X.txt
 
steppedDownAndPadded-{10..00..5}.txt ->
steppedDownAndPadded-10.txt
steppedDownAndPadded-05.txt
steppedDownAndPadded-00.txt
 
minusSignFlipsSequence {030..20..-5}.txt ->
minusSignFlipsSequence 020.txt
minusSignFlipsSequence 025.txt
minusSignFlipsSequence 030.txt
 
combined-{Q..P}{2..1}.txt ->
combined-Q2.txt
combined-Q1.txt
combined-P2.txt
combined-P1.txt
 
emoji{🌵..🌶}{🌽..🌾}etc ->
emoji🌵🌽etc
emoji🌵🌾etc
emoji🌶🌽etc
emoji🌶🌾etc
 
li{teral ->
li{teral
 
rangeless{}empty ->
rangeless{}empty
 
rangeless{random}string ->
rangeless{random}string
 
mixedNumberAlpha{5..k} ->
mixedNumberAlpha{5..k}
</pre>
9,476

edits