{-# LANGUAGE UndecidableInstances #-}

module Symparsec.Parser.TakeRest ( type TakeRest ) where

import Symparsec.Parser.Common
import qualified Data.Type.Symbol as Symbol

-- | Consume and return the rest of the input string.
--
-- Never fails. May return the empty string.
type TakeRest :: PParser Symbol
data TakeRest s
type instance App TakeRest s = TakeRest' s
type family TakeRest' s where
    TakeRest' ('State rem len idx) =
        'Reply (OK (Symbol.Take len rem)) ('State (Symbol.Drop len rem) 0 (idx+len))

{-
import GHC.TypeLits
import DeFun.Core

sTakeRest :: SParser SSymbol TakeRest
sTakeRest = Lam $ \(SState srem slen sidx) ->
        SReply (SOK _) (SState _ (SNat @0) _)
-}