-- | Text data in a variable file is encoded using a
-- special purpose code page. This module supports
-- decoding such text, using an approximate projection
-- into unicode.
module Data.TI85.Encoding (
    tiDecode
    ) where


import Data.Word
import Data.Array (Array, listArray, (!))
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.Text (Text)
import qualified Data.Text as T

-- | An approximation of the TI-86 code page as unocide.
tiCodePage :: Array Word8 Text
tiCodePage :: Array Word8 Text
tiCodePage = (Word8, Word8) -> [Text] -> Array Word8 Text
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Word8
0x00,Word8
0xff) [
    Text
"■",Text
"b",Text
"o",Text
"d",Text
"h",Text
"▸",Text
"⬆",Text
"⬇",Text
"∫",Text
"⨉",Text
"A",Text
"B",Text
"C",Text
"D",Text
"E",Text
"F",
    Text
"√",Text
"⁻¹",Text
"²",Text
"∠",Text
"°",Text
"ʳ",Text
"ᵀ",Text
"≤",Text
"≠",Text
"≥",Text
"⁻",Text
"ᴇ",Text
"→",Text
"₁₀",Text
"↑",Text
"↓",
    Text
" ",Text
"!",Text
"\"",Text
"#",Text
"$",Text
"%",Text
"&",Text
"'",Text
"(",Text
")",Text
"*",Text
"+",Text
",",Text
"-",Text
".",Text
"/",
    Text
"0",Text
"1",Text
"2",Text
"3",Text
"4",Text
"5",Text
"6",Text
"7",Text
"8",Text
"9",Text
":",Text
";",Text
"<",Text
"=",Text
">",Text
"?",
    Text
"@",Text
"A",Text
"B",Text
"C",Text
"D",Text
"E",Text
"F",Text
"G",Text
"H",Text
"I",Text
"J",Text
"K",Text
"L",Text
"M",Text
"N",Text
"O",
    Text
"P",Text
"Q",Text
"R",Text
"S",Text
"T",Text
"U",Text
"V",Text
"W",Text
"X",Text
"Y",Text
"Z",Text
"[",Text
"\\",Text
"]",Text
"^",Text
"_",
    Text
"`",Text
"a",Text
"b",Text
"c",Text
"d",Text
"e",Text
"f",Text
"g",Text
"h",Text
"i",Text
"j",Text
"k",Text
"l",Text
"m",Text
"n",Text
"o",
    Text
"p",Text
"q",Text
"r",Text
"s",Text
"t",Text
"u",Text
"v",Text
"w",Text
"x",Text
"y",Text
"z",Text
"{",Text
"|",Text
"}",Text
"~",Text
"=",
    Text
"₀",Text
"₁",Text
"₂",Text
"₃",Text
"₄",Text
"₅",Text
"₆",Text
"₇",Text
"₈",Text
"₉",Text
"Á",Text
"À",Text
"Â",Text
"Ä",Text
"á",Text
"à",
    Text
"â",Text
"ä",Text
"É",Text
"È",Text
"Ê",Text
"Ë",Text
"é",Text
"è",Text
"ê",Text
"ë",Text
"Í",Text
"Ì",Text
"Î",Text
"Ï",Text
"í",Text
"ì",
    Text
"î",Text
"ï",Text
"Ó",Text
"Ò",Text
"Ô",Text
"Ö",Text
"ó",Text
"ò",Text
"ô",Text
"ö",Text
"Ú",Text
"Ù",Text
"Û",Text
"Ü",Text
"ú",Text
"ù",
    Text
"û",Text
"ü",Text
"Ç",Text
"ç",Text
"Ñ",Text
"ñ",Text
"´",Text
"`",Text
"¨",Text
"¿",Text
"¡",Text
"α",Text
"β",Text
"γ",Text
"Δ",Text
"δ",
    Text
"ε",Text
"θ",Text
"λ",Text
"μ",Text
"π",Text
"ρ",Text
"Σ",Text
"σ",Text
"τ",Text
"φ",Text
"Ω",Text
"x̅",Text
"y̅",Text
"ˣ",Text
"…",Text
"◂",
    Text
"■",Text
"≀",Text
"-",Text
"²",Text
"°",Text
"³",Text
"\n",Text
"➡",Text
"╲",Text
"╲",Text
"◥",Text
"◣",Text
"⊸",Text
"∘",Text
"⋱",Text
"█",
    Text
"⇧",Text
"A",Text
"a",Text
"_",Text
"↥",Text
"A̲",Text
"a̲",Text
"▩",Text
"▫",Text
"₊",Text
".",Text
"⁴",Text
"=",Text
"■",Text
"■",Text
"■",
    Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■",Text
"■"]


-- |Decode a bytestring into text using the 
-- TI-86 screen code page.
tiDecode :: ByteString -> Text
tiDecode :: ByteString -> Text
tiDecode = [Text] -> Text
T.concat ([Text] -> Text) -> (ByteString -> [Text]) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word8 -> Text) -> [Word8] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Array Word8 Text
tiCodePageArray Word8 Text -> Word8 -> Text
forall i e. Ix i => Array i e -> i -> e
!) ([Word8] -> [Text])
-> (ByteString -> [Word8]) -> ByteString -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack