#!/usr/bin/env bb

(require '[babashka.fs :as fs]
         '[clojure.string :as str])

(defn syllables->jamo [s]
  "Convert Hangul syllables in string S to their jamo components."
  (->> s
       (map int)
       (mapcat
        (fn [c]
          (if (<= 0xAC00 c 0xD7A3)
            ;; Hangul syllable - decompose
            (let [code (- c 0xAC00)
                  lead (quot code (* 21 28))
                  medial (quot (mod code (* 21 28)) 28)
                  final (mod code 28)
                  lead-jamo (+ 0x1100 lead)
                  medial-jamo (+ 0x1161 medial)
                  final-jamo (if (> final 0) (+ 0x11A7 final) nil)]
              (remove nil? [lead-jamo medial-jamo final-jamo]))
            ;; Not a Hangul syllable
            [c])))
       (map char)
       (apply str)))


(defn -main [& args]
  (if (seq args)
    (doseq [f args]
      (let [x (-> (slurp f)
                  (str/replace #"\p{block=HangulSyllables}+"
                               syllables->jamo))]
        (spit f x)))
    (loop [line (read-line)]
      (when line
        (-> line
            (str/replace #"\p{block=HangulSyllables}+"
                         syllables->jamo)
            println)
        (recur (read-line))))))

(when (= *file* (System/getProperty "babashka.file"))
  (apply -main *command-line-args*))
