foo : String
foo = "λx→x"

bar : String
bar = "λx→x"

baz : Char
baz = 'λ'

quux : String
quux = "\x0a\x80\xC9\xFF\n3\n4"

appMany : Nat -> String
appMany Z = foo
appMany (S k) = bar ++ appMany k

main : IO ()
main = do putStrLn foo
          putStrLn (foo ++ bar)
          putStrLn (reverse (foo ++ bar))
          printLn (length foo)
          printLn baz
          printLn (strCons '\x141' "")
          printLn (singleton (chr 0x141))
          let x = 4
          let newstr = appMany (toNat x)
          putStrLn newstr
          printLn (strHead newstr)
          printLn (length newstr)
          printLn (strIndex newstr 4)
          putStrLn (strCons (strIndex newstr 4) "")
          putStrLn ("Tail: " ++ strTail newstr)
          putStrLn ("Tail Tail: " ++ strTail (strTail newstr))
          putStrLn ("Cons: " ++ strCons 'λ' newstr)
          putStrLn ("Reverse: " ++ reverse newstr)
          printLn [1..5]
          printLn [5..1]
          printLn [(-9), (-7)..(-1)]
          printLn [17,15..1]
          printLn [19,15..2]
          printLn [-2,0..4]
          printLn [1,0..-2]
          printLn [3,5..3]
          printLn [2,1..2]
          printLn [4,1..3]
          printLn [1,4..2]
          printLn [3,5..1]
          printLn [4,1..5]
          printLn [1,1..2]
          printLn [2,2..1]
          printLn $ the (List Nat) [1..5]
          printLn $ the (List Nat) [5..1]
          printLn $ the (List Nat) [5,4..1]
          printLn $ the (List Nat) [1,3..5]
          printLn $ the (List Nat) [5,3..1]
          printLn $ the (List Nat) [3,5..3]
          printLn $ the (List Nat) [2,1..2]
          printLn $ the (List Nat) [4,1..3]
          printLn $ the (List Nat) [1,4..2]
          printLn $ the (List Nat) [3,5..1]
          printLn $ the (List Nat) [4,1..5]
          printLn $ the (List Nat) [1,1..2]
          printLn $ the (List Nat) [2,2..1]
          printLn $ the (List Int) [(-1)..(-5)]
          printLn $ the (List Int) [-2,0..4]
          printLn $ the (List Int) [1,0..-2]
          printLn $ the (List Int) [3,5..3]
          printLn $ the (List Int) [2,1..2]
          printLn $ the (List Int) [4,1..3]
          printLn $ the (List Int) [1,4..2]
          printLn $ the (List Int) [3,5..1]
          printLn $ the (List Int) [4,1..5]
          printLn $ the (List Int) [1,1..2]
          printLn $ the (List Int) [2,2..1]
          printLn ['z'..'x']
          printLn ['g','e'..'a']
          printLn ['x'..'z']
          printLn ['a','c'..'g']
