{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Utils where

import           Control.Applicative     ((<$>), (<*), (<*>))

import           Data.Char               (Char)
import           Data.Either             (Either (..))
import           Data.Text               (Text)

import           Data.Attoparsec.Text    (Parser, anyChar, endOfInput,
                                          parseOnly)

import           Waargonaut.Decode       (parseWith)
import           Waargonaut.Decode.Error (DecodeError)

testparse
  :: Parser a
  -> Text
  -> Either DecodeError a
testparse p =
  parseWith parseOnly p

testparsetheneof
  :: Parser a
  -> Text
  -> Either DecodeError a
testparsetheneof p =
  testparse (p <* endOfInput)

testparsethennoteof
  :: Parser a
  -> Text
  -> Either DecodeError a
testparsethennoteof p =
  testparse (p <* anyChar)

testparsethen
  :: Parser a
  -> Text
  -> Either DecodeError (a, Char)
testparsethen p =
  testparse ((,) <$> p <*> anyChar <* endOfInput)