{-# LINE 1 "Haskell.hs.neat" #-}
-- Copyright 2014 Alvaro J. Genial [http://alva.ro]; see LICENSE file for more.

module Text.Neat.Output.Haskell (outputHS) where

import Text.Neat.Template
import Text.Neat.Output


instance Output File where
 output (File path (Block chunks)) = ({-# LINE 10 "Haskell.hs.neat" #-}
  "" ++ ({-# LINE 11 "Haskell.hs.neat" #-}
  let _l = list (chunks) in
    if (not . null) _l
      then _l >>= \{-# LINE 11 "Haskell.hs.neat" #-}
  chunk @ (Chunk location element) -> ({-# LINE 11 "Haskell.hs.neat" #-}
    "" ++ ({-# LINE 12 "Haskell.hs.neat" #-}
    
      case (element) of {-# LINE 13 "Haskell.hs.neat" #-}
    (Text text) -> (({-# LINE 13 "Haskell.hs.neat" #-}
      output (location)) ++ ({-# LINE 13 "Haskell.hs.neat" #-}
      output (text)) ++ {-# LINE 13 "Haskell.hs.neat" #-}
      "") 
    _ -> (({-# LINE 14 "Haskell.hs.neat" #-}
      output (chunk)) ++ {-# LINE 14 "Haskell.hs.neat" #-}
      "")) ++ {-# LINE 15 "Haskell.hs.neat" #-}
    "")
      else []) ++ {-# LINE 16 "Haskell.hs.neat" #-}
  ""){-# LINE 17 "Haskell.hs.neat" #-}


instance Output Block where
 output (Block chunks) = ({-# LINE 20 "Haskell.hs.neat" #-}
  "(" ++ ({-# LINE 20 "Haskell.hs.neat" #-}
  output (nest $ join " ++ " $ chunks)) ++ {-# LINE 20 "Haskell.hs.neat" #-}
  ")"){-# LINE 20 "Haskell.hs.neat" #-}


instance Output Chunk where
 output chunk @ (Chunk location element) = ({-# LINE 23 "Haskell.hs.neat" #-}
  "" ++ ({-# LINE 24 "Haskell.hs.neat" #-}
  
    case (chunk) of {-# LINE 25 "Haskell.hs.neat" #-}
  (Chunk _ (Define _ _)) -> (({-# LINE 25 "Haskell.hs.neat" #-}
    output (element)) ++ {-# LINE 25 "Haskell.hs.neat" #-}
    ""){-# LINE 26 "Haskell.hs.neat" #-}
  (Chunk _ (Text _)) -> (({-# LINE 26 "Haskell.hs.neat" #-}
    output (location)) ++ ({-# LINE 26 "Haskell.hs.neat" #-}
    output (element)) ++ {-# LINE 26 "Haskell.hs.neat" #-}
    "") 
  _ -> ({-# LINE 27 "Haskell.hs.neat" #-}
    "(" ++ ({-# LINE 27 "Haskell.hs.neat" #-}
    output (location)) ++ ({-# LINE 27 "Haskell.hs.neat" #-}
    output (element)) ++ {-# LINE 27 "Haskell.hs.neat" #-}
    ")")) ++ {-# LINE 28 "Haskell.hs.neat" #-}
  ""){-# LINE 29 "Haskell.hs.neat" #-}


instance Output Case where
 output (Case pattern block) = (({-# LINE 32 "Haskell.hs.neat" #-}
  output (pattern)) ++ {-# LINE 32 "Haskell.hs.neat" #-}
  " -> " ++ ({-# LINE 32 "Haskell.hs.neat" #-}
  output (block))){-# LINE 32 "Haskell.hs.neat" #-}


instance Output Location where
 output (Location file line) = ({-# LINE 35 "Haskell.hs.neat" #-}
  "{-# LINE " ++ ({-# LINE 35 "Haskell.hs.neat" #-}
  output (line)) ++ {-# LINE 35 "Haskell.hs.neat" #-}
  " " ++ ({-# LINE 35 "Haskell.hs.neat" #-}
  output (quote $ file)) ++ {-# LINE 35 "Haskell.hs.neat" #-}
  " #-}\n"){-# LINE 37 "Haskell.hs.neat" #-}


instance Output Function where
 output (Function _ name (Pattern _ pattern)) = (({-# LINE 40 "Haskell.hs.neat" #-}
  output (name)) ++ ({-# LINE 40 "Haskell.hs.neat" #-}
  output (pattern))){-# LINE 40 "Haskell.hs.neat" #-}


instance Output Value where
 output (Value location pipeline) = ({-# LINE 43 "Haskell.hs.neat" #-}
  "(" ++ ({-# LINE 43 "Haskell.hs.neat" #-}
  output (join " $ " $ reverse $ pipeline)) ++ {-# LINE 43 "Haskell.hs.neat" #-}
  ")"){-# LINE 43 "Haskell.hs.neat" #-}


instance Output Pattern where
 output (Pattern location pattern) = (({-# LINE 46 "Haskell.hs.neat" #-}
  output (location)) ++ ({-# LINE 46 "Haskell.hs.neat" #-}
  output (pattern))){-# LINE 46 "Haskell.hs.neat" #-}


instance Output Element where
 output (Output value) = ({-# LINE 49 "Haskell.hs.neat" #-}
  "output " ++ ({-# LINE 49 "Haskell.hs.neat" #-}
  output (value))){-# LINE 49 "Haskell.hs.neat" #-}

 output (Comment comment) = (({-# LINE 50 "Haskell.hs.neat" #-}
  output ('{')) ++ {-# LINE 50 "Haskell.hs.neat" #-}
  "#" ++ ({-# LINE 50 "Haskell.hs.neat" #-}
  output (comment)) ++ {-# LINE 50 "Haskell.hs.neat" #-}
  "#" ++ ({-# LINE 50 "Haskell.hs.neat" #-}
  output ('}'))){-# LINE 50 "Haskell.hs.neat" #-}

 output (Define function block) = (({-# LINE 51 "Haskell.hs.neat" #-}
  output (function)) ++ {-# LINE 51 "Haskell.hs.neat" #-}
  " = " ++ ({-# LINE 51 "Haskell.hs.neat" #-}
  output (block))){-# LINE 51 "Haskell.hs.neat" #-}

 output (Filter value block) = (({-# LINE 52 "Haskell.hs.neat" #-}
  output (value)) ++ {-# LINE 52 "Haskell.hs.neat" #-}
  " " ++ ({-# LINE 52 "Haskell.hs.neat" #-}
  output (block))){-# LINE 52 "Haskell.hs.neat" #-}


 output (For (Binding pattern value) block other) = ({-# LINE 54 "Haskell.hs.neat" #-}
  "let _l = list " ++ ({-# LINE 54 "Haskell.hs.neat" #-}
  output (value)) ++ {-# LINE 54 "Haskell.hs.neat" #-}
  " in\n  if (not . null) _l\n    then _l >>= \\" ++ ({-# LINE 56 "Haskell.hs.neat" #-}
  output (pattern)) ++ {-# LINE 56 "Haskell.hs.neat" #-}
  " -> " ++ ({-# LINE 56 "Haskell.hs.neat" #-}
  output (block)) ++ {-# LINE 56 "Haskell.hs.neat" #-}
  "\n    else " ++ ({-# LINE 57 "Haskell.hs.neat" #-}
  output (unless other "[]")) ++ {-# LINE 57 "Haskell.hs.neat" #-}
  ""){-# LINE 58 "Haskell.hs.neat" #-}


 output (If value block other) = ({-# LINE 60 "Haskell.hs.neat" #-}
  "if (not . zero) " ++ ({-# LINE 60 "Haskell.hs.neat" #-}
  output (value)) ++ {-# LINE 60 "Haskell.hs.neat" #-}
  "\n  then " ++ ({-# LINE 61 "Haskell.hs.neat" #-}
  output (block)) ++ {-# LINE 61 "Haskell.hs.neat" #-}
  "\n  else " ++ ({-# LINE 62 "Haskell.hs.neat" #-}
  output (unless other "[]")) ++ {-# LINE 62 "Haskell.hs.neat" #-}
  ""){-# LINE 63 "Haskell.hs.neat" #-}


 output (Switch value cases other) = ({-# LINE 65 "Haskell.hs.neat" #-}
  "\n  case " ++ ({-# LINE 66 "Haskell.hs.neat" #-}
  output (value)) ++ {-# LINE 66 "Haskell.hs.neat" #-}
  " of " ++ ({-# LINE 66 "Haskell.hs.neat" #-}
  output (cases)) ++ {-# LINE 66 "Haskell.hs.neat" #-}
  " " ++ ({-# LINE 66 "Haskell.hs.neat" #-}
  if (not . zero) (other)
    then ({-# LINE 66 "Haskell.hs.neat" #-}
    "\n_ -> " ++ ({-# LINE 67 "Haskell.hs.neat" #-}
    output (other)))
    else []) ++ {-# LINE 67 "Haskell.hs.neat" #-}
  ""){-# LINE 68 "Haskell.hs.neat" #-}


 output (With (Binding pattern value) block) = ({-# LINE 70 "Haskell.hs.neat" #-}
  "\n  case " ++ ({-# LINE 71 "Haskell.hs.neat" #-}
  output (value)) ++ {-# LINE 71 "Haskell.hs.neat" #-}
  " of " ++ ({-# LINE 71 "Haskell.hs.neat" #-}
  output (pattern)) ++ {-# LINE 71 "Haskell.hs.neat" #-}
  " -> " ++ ({-# LINE 71 "Haskell.hs.neat" #-}
  output (block)) ++ {-# LINE 71 "Haskell.hs.neat" #-}
  ""){-# LINE 72 "Haskell.hs.neat" #-}


 output (Text text) = (({-# LINE 74 "Haskell.hs.neat" #-}
  output (quote $ prune $ text))){-# LINE 74 "Haskell.hs.neat" #-}



outputHS :: File -> String
outputHS = output