capnp-0.2.0.0: lib/Data/Capnp/GenHelpers/Pure.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{- |
Module: Data.Capnp.GenHelpers.Pure
Description: Misc. helpers for generated code.
This module provides various helpers used by generated code; developers
are not expected to invoke them directly.
These helpers are only used by the high-level api. "Data.Capnp.GenHelpers"
defines helpers used by the low-level api.
-}
module Data.Capnp.GenHelpers.Pure where
import Control.Monad.Catch.Pure (runCatchT)
import Data.Either (fromRight)
import Data.Functor.Identity (runIdentity)
import Data.Capnp.TraversalLimit (evalLimitT)
import qualified Data.Capnp.Classes as C
import qualified Data.Capnp.Message as M
import qualified Data.Capnp.Untyped as U
-- | A valid implementation for 'Data.Default.Default' for any type that meets
-- the given constraints.
defaultStruct :: (C.Decerialize a, C.FromStruct M.ConstMsg (C.Cerial M.ConstMsg a)) => a
defaultStruct =
fromRight (error "impossible") $
runIdentity $
runCatchT $
evalLimitT maxBound $
U.rootPtr M.empty >>= C.fromStruct >>= C.decerialize