import Prelude (return,otherwise,(>>),(>>=),(<),Maybe(..))
import Data.Char (ord,isAscii)
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy.UTF8 as U
import qualified System.IO as S
expand_haskell_op c = case ord c of
0x00AC -> S.putStr "not" {- NOT SIGN -}
0x00F7 -> S.putStr "/" {- DIVISION SIGN -}
0x03B1 -> S.putStr "a" {- GREEK SMALL LETTER ALPHA -}
0x03B2 -> S.putStr "b" {- GREEK SMALL LETTER BETA -}
0x03B3 -> S.putStr "c" {- GREEK SMALL LETTER GAMMA -}
0x03B4 -> S.putStr "d" {- GREEK SMALL LETTER DELTA -}
0x03B5 -> S.putStr "epsilon" {- GREEK SMALL LETTER EPSILON -}
0x03C0 -> S.putStr "pi" {- GREEK SMALL LETTER PI -}
0x2042 -> S.putStr "***" {- ASTERISM -}
0x2190 -> S.putStr "<-" {- LEFTWARDS ARROW -}
0x2192 -> S.putStr "->" {- RIGHTWARDS ARROW -}
0x21D0 -> S.putStr "<=" {- LEFTWARDS DOUBLE ARROW -}
0x21D2 -> S.putStr "=>" {- RIGHTWARDS DOUBLE ARROW -}
0x2200 -> S.putStr "forall" {- FOR ALL -}
0x2208 -> S.putStr "`elem`" {- ELEMENT OF -}
0x2209 -> S.putStr "`notElem`" {- NOT AN ELEMENT OF -}
0x2216 -> S.putStr "\\\\" {- SET MINUS -}
0x2218 -> S.putStr "." {- RING OPERATOR -}
0x2227 -> S.putStr "&&" {- LOGICAL AND -}
0x2228 -> S.putStr "||" {- LOGICAL OR -}
0x2229 -> S.putStr "`intersect`" {- INTERSECTION -}
0x222A -> S.putStr "`union`" {- UNION -}
0x2237 -> S.putStr "::" {- PROPORTION -}
0x2260 -> S.putStr "/=" {- NOT EQUAL TO -}
0x2261 -> S.putStr "==" {- IDENTICAL TO -}
0x2262 -> S.putStr "/=" {- NOT IDENTICAL TO -}
0x2264 -> S.putStr "<=" {- LESS-THAN OR EQUAL TO -}
0x2265 -> S.putStr ">=" {- GREATER-THAN OR EQUAL TO -}
0x226B -> S.putStr ">>" {- MUCH GREATER-THAN -}
0x226E -> S.putStr ">=" {- NOT LESS-THAN -}
0x226F -> S.putStr "<=" {- NOT GREATER-THAN -}
0x2295 -> S.putStr "`mappend`" {- CIRCLED PLUS -}
0x229B -> S.putStr "<*>" {- CIRCLED ASTERISK OPERATOR -}
0x22A5 -> S.putStr "undefined" {- UP TACK -}
0x22C5 -> S.putStr "*" {- DOT OPERATOR -}
0x22D8 -> S.putStr "<<<" {- VERY MUCH LESS-THAN -}
0x22D9 -> S.putStr ">>>" {- VERY MUCH GREATER-THAN -}
0x29FA -> S.putStr "++" {- DOUBLE PLUS -}
0x29FB -> S.putStr "+++" {- TRIPLE PLUS -}
0x2AF4 -> S.putStr "|||" {- TRIPLE VERTICAL BAR BINARY RELATION -}
_ -> S.putChar c
deunicode s
| B.null s = return ()
| otherwise = B.putStr ascii >> deunicode' rest
where
(ascii,rest) = U.span isAscii s
deunicode' s = expand nonascii >> deunicode rest
where
(nonascii,rest) = U.break isAscii s
expand s = case U.decode s of
Nothing -> return ()
Just (c,rest) -> expand_haskell_op c
main = B.getContents >>= deunicode