module Language.Brainfuck.Examples where

-- Example Programs
helloWorld, bottles, helloum, sort, toupper :: String
helloWorld :: String
helloWorld =
  ">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<.#>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++["String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<++++>-]<+.[-]++++++++++."
-- works now, thanks to int-e for explaining the BF spec to me
bottles :: String
bottles =
  "99 Bottles of Beer in Urban Mueller's BrainF*** (The actual"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "name is impolite)"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ""String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "by Ben Olmstead"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ""String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "ANSI C interpreter available on the internet; due to"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "constraints in comments the address below needs to have the"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "stuff in parenthesis replaced with the appropriate symbol:"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ""String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "http://www(dot)cats(dash)eye(dot)com/cet/soft/lang/bf/"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ""String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "Believe it or not this language is indeed Turing complete!"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "Combines the speed of BASIC with the ease of INTERCAL and"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "the readability of an IOCCC entry!"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ""String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">+++++++++[<+++++++++++>-]<[>[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "[>>+>+<<<-]>>>[<<<+>>>-]>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<+++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "++++[<+++++++++>-]<.><+++++..--------.-------.>>[>>+>+<<<-]>"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<+++++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+>-]<.>+++++++++[<+++++++++>-]<--.---------.>+++++++[<------"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "---->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++.>++++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "[<---------->-]<++.>++++++++[<++++++++++>-]<++++.-----------"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-."String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">++[<----------->-]<.+++++++++++..>+++++++++[<---------->-]<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-----.---.>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>>+++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+[<++++++>-]<--.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<."String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "><+++++..--------.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+++++++++>-]<.+++..+++++++++++++.>++++++++++[<---------->-]<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-.---.>+++++++[<++++++++++>-]<++++.+++++++++++++.++++++++++."String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "------.>+++++++[<---------->-]<+.>++++++++[<++++++++++>-]<-."String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-.---------.>+++++++[<---------->-]<+.>+++++++[<++++++++++>-"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "+++[<---------->-]<++.>++++++++[<++++++++++>-]<.>+++[<----->"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "++++++++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ".>+++++[<+++++++++++++>-]<.>+++[<++++++>-]<-.---.++++++.----"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "---.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>["String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-]<<[>+>+<<-]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<->-]>>+>[<[-]<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<-[>[-]<[-]]>>+<[>[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<++++++++>"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..---"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-----.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ".>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++>-]<-"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "-.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<.+++..+++++++++++++.>++++++++[<---------->-]<--.>+++++++++["String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+."String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">++++++++[<+++++++++++>-]<-.>++[<----------->-]<.+++++++++++"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "@"
helloum :: String
helloum =
  "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.@"
-- can't figure this one out either...
sort :: String
sort =
  "Here is a Brainf*** program that bubblesorts its input and spits it out:"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  ">>>>>,+[>>>,+]<<<[<<<"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "[>>>[-<<<-<+>[>]>>]<<<[<]>>"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "[>>>+<<<-]<[>+>>>+<<<<-]"String -> String -> String
forall a. [a] -> [a] -> [a]
++
  "<<]>>>[-.[-]]>>>[>>>]<<<]"
toupper :: String
toupper =
  ",----------[----------------------.,----------]"

{-
Example optimized programs:

++++[>++++++++<-]>[.+]

[(0,IncByteBy 4),  (1,SetIpTo 7),     (2,IncPtrBy 1),
 (3,IncByteBy 8),  (4,IncPtrBy (-1)), (5,IncByteBy (-1)),
 (6,SetIpTo (-1)), (7,IncPtrBy 1),    (8,SetIpTo 12),
 (9,OutputByte),   (10,IncByteBy 1),  (11,SetIpTo (-8)),
 (12,Halt)
]

[[]]

[(0,SetIpTo 4),
 (1,SetIpTo 3),
 (2,SetIpTo (-1)),
 (3,SetIpTo 0),
 (4,Halt)
]

-}