From 318ca4fdf1c31b4ff1e5905883f8d83e0853da46 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 9 Aug 2025 07:48:49 +0100 Subject: [PATCH] begin coding layer tree so that we have toggleable layers --- dotscape | Bin 1051816 -> 1051816 bytes dotscape.mlb | 1 + fcore/layer-tree.sml | 58 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 fcore/layer-tree.sml diff --git a/dotscape b/dotscape index 400f36c959b232f93e20fec5679b8a24b9979751..5ffccb189289299172fb6ab5fd119edbf86d77eb 100755 GIT binary patch delta 11599 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 delta 11552 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 NODE {key = newKey, value = newValue, left = LEAF, right = LEAF} + | NODE {key, value, left, right} => + if newKey < key then + let val left = insert (newKey, newValue, left) + in NODE {key = key, value = value, left = left, right = right} + end + else if newKey > key then + let val right = insert (newKey, newValue, right) + in NODE {key = key, value = value, left = left, right = right} + end + else + NODE {key = key, value = newValue, left = left, right = right} + + fun get (searchKey, tree) = + case tree of + LEAF => NONE + | NODE {key, value, left, right} => + if searchKey < key then get (searchKey, left) + else if searchKey > key then get (searchKey, right) + else SOME value + + (* copies non-blank pixels in value vector into acc *) + fun helpFlatten (value, acc) = + Vector.mapi + (fn (xIdx, valueYAxis) => + Vector.mapi + (fn (yIdx, valuePixel) => + if isBlank valuePixel then + let val accYAxis = Vector.sub (acc, xIdx) + in Vector.sub (accYAxis, yIdx) + end + else + valuePixel) valueYAxis) value + + fun flatten (tree, acc) = + case tree of + LEAF => acc + | NODE {value, left, right, ...} => + let + val acc = flatten (left, acc) + val acc = helpFlatten (value, acc) + in + flatten (right, acc) + end +end