{-# LANGUAGE RankNTypes #-}
module Data.Schema
( Field
, Fields
, field
, optional
, alt
, Schema
, HasSchema (..)
, prim
, const
, record
, asList
, toList
, oneOf
, alias
) where
import Control.Functor.HigherOrder
import Control.Lens
import Data.Functor.Invariant
import Data.Hashable (Hashable)
import Data.HashMap.Strict (HashMap)
import qualified Data.List.NonEmpty as NEL
import Data.Schema.Internal.Types
import Data.Text (Text)
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import Prelude hiding (const, seq)
alt :: Text -> s b -> Prism' a b -> AltDef s a
alt = AltDef
prim :: p a -> Schema p a
prim primAlg = Schema (HFix $ PrimitiveSchema primAlg)
const :: a -> Schema p a
const a = Schema (HFix (RecordSchema $ pure a))
record :: Fields (Schema p) a -> Schema p a
record ps = Schema (HFix (RecordSchema $ hoistField unwrapSchema ps))
asList :: Iso' (Vector a) [a]
asList = iso Vector.toList Vector.fromList
toList :: Schema p (Vector a) -> Schema p [a]
toList = invmap Vector.toList Vector.fromList
oneOf :: [AltDef (Schema p) a] -> Schema p a
oneOf alts = Schema (HFix (UnionSchema $ fmap (hfmap unwrapSchema) $ NEL.fromList alts))
alias :: Iso' a b -> Schema p a -> Schema p b
alias i base = invmap (view i) (view . from $ i) base