Sort an outline at every level: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: span -> takeWhile)
(Added Wren)
Line 317: Line 317:


Inconsistent indent depths: [4,3,8,9,8,4,4,4,4]</pre>
Inconsistent indent depths: [4,3,8,9,8,4,4,4,4]</pre>

=={{header|Wren}}==
{{libheader|Wren-sort}}
{{libheader|Wren-fmt}}
<lang ecmascript>import "/sort" for Sort
import "/fmt" for Fmt

var sortedOutline = Fn.new { |originalOutline, ascending|
var outline = originalOutline.toList // make copy in case we mutate it
var indent = ""
var del = "\x7f"
var sep = "\0"
var messages = []
if (outline[0].trimStart(" \t") != outline[0]) {
System.print(" outline structure is unclear")
return
}
for (i in 1...outline.count) {
var line = outline[i]
var lc = line.count
if (line.startsWith(" ") || line.startsWith(" \t") || line.startsWith("\t")) {
var lc2 = line.trimStart(" \t").count
if (lc2 < lc) {
var currIndent = line[0...lc-lc2]
if (indent == "") {
indent = currIndent
} else {
var rem = currIndent.count % indent.count
if (rem != 0) {
if ((currIndent.contains("\t") && !indent.contains("\t")) ||
(!currIndent.contains("\t") && indent.contains("\t"))) {
messages.add(indent + "corrected inconsistent whitespace use at line '%(line)'")
} else {
messages.add(indent + "corrected inconsistent indent width at line '%(line)'")
}
var mult = (currIndent.count / indent.count).round
outline[i] = (indent * mult) + line[lc-lc2..-1]
}
}
}
}
}
var levels = List.filled(outline.count, 0)
levels[0] = 1
var level = 1
var margin = ""
while (!levels.all { |l| l > 0 }) {
var mc = margin.count
for (i in 1...outline.count) {
if (levels[i] == 0) {
var line = outline[i]
if (line.startsWith(margin) && line[mc] != " " && line[mc] != "\t") levels[i] = level
}
}
margin = margin + indent
level = level + 1
}
var lines = List.filled(outline.count, "")
lines[0] = outline[0]
var nodes = []
for (i in 1...outline.count) {
if (levels[i] > levels[i-1]) {
nodes.add((nodes.count == 0) ? outline[i - 1] : sep + outline[i-1])
} else if (levels[i] < levels[i-1]) {
var j = levels[i-1] - levels[i]
for (k in 1..j) nodes.removeAt(-1)
}
if (nodes.count > 0) {
lines[i] = nodes.join() + sep + outline[i]
} else {
lines[i] = outline[i]
}
}
if (ascending) {
Sort.insertion(lines)
} else {
var maxLen = lines.reduce(0) { |max, l| (l.count > max) ? l.count : max }
for (i in 0...lines.count) lines[i] = Fmt.ljust(maxLen, lines[i], del)
Sort.insertion(lines, true)
}
for (i in 0...lines.count) {
var s = lines[i].split(sep)
lines[i] = s[-1]
if (!ascending) lines[i] = lines[i].trimEnd(del)
}
if (messages.count > 0) {
System.print(messages.join("\n"))
System.print()
}
System.print(lines.join("\n"))
}

var outline = [
"zeta",
" beta",
" gamma",
" lambda",
" kappa",
" mu",
" delta",
"alpha",
" theta",
" iota",
" epsilon"
]

var outline2 = outline.map { |s| s.replace(" ", "\t") }.toList

var outline3 = [
"alpha",
" epsilon",
" iota",
" theta",
"zeta",
" beta",
" delta",
" gamma",
" \t kappa",
" lambda",
" mu"
]

var outline4 = [
"zeta",
" beta",
" gamma",
" lambda",
" kappa",
" mu",
" delta",
"alpha",
" theta",
" iota",
" epsilon"
]

System.print("Four space indented outline, ascending sort:")
sortedOutline.call(outline, true)

System.print("\nFour space indented outline, descending sort:")
sortedOutline.call(outline, false)

System.print("\nTab indented outline, ascending sort:")
sortedOutline.call(outline2, true)

System.print("\nTab indented outline, descending sort:")
sortedOutline.call(outline2, false)

System.print("\nFirst unspecified outline, ascending sort:")
sortedOutline.call(outline3, true)

System.print("\nFirst unspecified outline, descending sort:")
sortedOutline.call(outline3, false)

System.print("\nSecond unspecified outline, ascending sort:")
sortedOutline.call(outline4, true)

System.print("\nSecond unspecified outline, descending sort:")
sortedOutline.call(outline4, false)</lang>

{{out}}
<pre>
Four space indented outline, ascending sort:
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu

Four space indented outline, descending sort:
zeta
gamma
mu
lambda
kappa
delta
beta
alpha
theta
iota
epsilon

Tab indented outline, ascending sort:
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu

Tab indented outline, descending sort:
zeta
gamma
mu
lambda
kappa
delta
beta
alpha
theta
iota
epsilon

First unspecified outline, ascending sort:
corrected inconsistent whitespace use at line ' kappa'

alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu

First unspecified outline, descending sort:
corrected inconsistent whitespace use at line ' kappa'

zeta
gamma
mu
lambda
kappa
delta
beta
alpha
theta
epsilon
iota

Second unspecified outline, ascending sort:
corrected inconsistent indent width at line ' gamma'
corrected inconsistent indent width at line ' kappa'

alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu

Second unspecified outline, descending sort:
corrected inconsistent indent width at line ' gamma'
corrected inconsistent indent width at line ' kappa'

zeta
gamma
mu
lambda
kappa
delta
beta
alpha
theta
iota
epsilon
</pre>