module Data.Ruby.Marshal (
decode
, decodeEither
, fromRuby
, toRuby
, module Data.Ruby.Marshal.Types
) where
import Control.Monad.State.Strict (evalStateT)
import qualified Data.ByteString as BS
import Data.Ruby.Marshal.Get
import Data.Ruby.Marshal.Monad (emptyCache, runMarshal)
import Data.Ruby.Marshal.RubyObject
import Data.Ruby.Marshal.Types
import Data.Serialize (runGet)
decode :: BS.ByteString
-> Maybe RubyObject
decode :: ByteString -> Maybe RubyObject
decode = Either String RubyObject -> Maybe RubyObject
forall a b. Either a b -> Maybe b
hush (Either String RubyObject -> Maybe RubyObject)
-> (ByteString -> Either String RubyObject)
-> ByteString
-> Maybe RubyObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String RubyObject
decodeEither
decodeEither :: BS.ByteString
-> Either String RubyObject
decodeEither :: ByteString -> Either String RubyObject
decodeEither = Get RubyObject -> ByteString -> Either String RubyObject
forall a. Get a -> ByteString -> Either String a
runGet (StateT Cache Get RubyObject -> Cache -> Get RubyObject
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (Marshal RubyObject -> StateT Cache Get RubyObject
forall a. Marshal a -> StateT Cache Get a
runMarshal Marshal RubyObject
getRubyObject) Cache
emptyCache)
hush :: Either a b -> Maybe b
hush :: Either a b -> Maybe b
hush = (a -> Maybe b) -> (b -> Maybe b) -> Either a b -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe b -> a -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing) b -> Maybe b
forall a. a -> Maybe a
Just