module Argo.Decode where

import qualified Argo.Class.FromValue as FromValue
import qualified Argo.Decoder as Decoder
import qualified Argo.Type.Value as Value
import qualified Data.ByteString as ByteString

decode :: FromValue.FromValue a => ByteString.ByteString -> Maybe a
decode :: ByteString -> Maybe a
decode = (Value -> Maybe a) -> ByteString -> Maybe a
forall a. (Value -> Maybe a) -> ByteString -> Maybe a
decodeWith Value -> Maybe a
forall a. FromValue a => Value -> Maybe a
FromValue.fromValue

decodeWith :: (Value.Value -> Maybe a) -> ByteString.ByteString -> Maybe a
decodeWith :: (Value -> Maybe a) -> ByteString -> Maybe a
decodeWith Value -> Maybe a
f ByteString
x = do
    (ByteString
_, Value
y) <- Decoder Value -> ByteString -> Maybe (ByteString, Value)
forall a. Decoder a -> ByteString -> Maybe (ByteString, a)
Decoder.run (Decoder ()
Decoder.spaces Decoder () -> Decoder Value -> Decoder Value
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Decoder Value
Value.decode Decoder Value -> Decoder () -> Decoder Value
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Decoder ()
Decoder.eof) ByteString
x
    Value -> Maybe a
f Value
y