module Language.Nock5K.Parse where

import Control.Applicative ((<$>))
import Language.Nock5K.Spec
import Text.ParserCombinators.Parsec

instance Show Noun where
  show (Atom a) = show a
  show x@(_ :- _) = "[" ++ showCell x ++ "]"
    where showCell (a :- b) = show a ++ " " ++ showCell b
          showCell a = show a

noun :: Parser Noun
noun = atom <|> cell

atom :: Parser Noun
atom = (Atom . read) <$> many1 digit

cell :: Parser Noun
cell = foldr1 (:-) <$> (noun `sepBy2` char ' ') `surroundBy` "[]"
  where
    p `sepBy2` sep = do { a <- p; sep; bs <- p `sepBy1` sep; return (a:bs) }
    p `surroundBy` (s:e:_) = do { char s; a <- p; char e; return a }