-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Codegen helping you define domain models -- --
-- {-# LANGUAGE
-- QuasiQuotes, TemplateHaskell,
-- StandaloneDeriving, DeriveGeneric, DeriveDataTypeable, DeriveLift,
-- FlexibleInstances, MultiParamTypeClasses,
-- DataKinds, TypeFamilies
-- #-}
-- module Model where
--
-- import Data.Text (Text)
-- import Data.Word (Word16, Word32, Word64)
-- import Domain
--
-- declare
-- (Just (False, True))
-- stdDeriver
-- [schema|
--
-- Host:
-- sum:
-- ip: Ip
-- name: Text
--
-- Ip:
-- sum:
-- v4: Word32
-- v6: Word128
--
-- Word128:
-- product:
-- part1: Word64
-- part2: Word64
--
-- |]
--
schema :: QuasiQuoter
-- | Load and parse a YAML file into a schema definition.
--
-- Use declare to generate the code from it.
--
--
-- {-# LANGUAGE
-- TemplateHaskell,
-- StandaloneDeriving, DeriveGeneric, DeriveDataTypeable, DeriveLift,
-- FlexibleInstances, MultiParamTypeClasses,
-- DataKinds, TypeFamilies
-- #-}
-- module Model where
--
-- import Data.Text (Text)
-- import Data.Word (Word16, Word32, Word64)
-- import Domain
--
-- declare
-- (Just (True, False))
-- stdDeriver
-- =<< loadSchema "domain.yaml"
--
loadSchema :: FilePath -> Q Schema
-- | Specification of which instances to automatically derive for all the
-- supported types in the model and how.
--
-- You can combine derivers using Monoid and Semigroup.
data Deriver
-- | Combination of all derivers exported by this module.
stdDeriver :: Deriver
-- | Derives Enum for enums or sums having no members in all
-- variants.
--
-- Requires to have the StandaloneDeriving compiler extension
-- enabled.
enumDeriver :: Deriver
-- | Derives Bounded for enums.
--
-- Requires to have the StandaloneDeriving compiler extension
-- enabled.
boundedDeriver :: Deriver
-- | Derives Show.
--
-- Requires to have the StandaloneDeriving compiler extension
-- enabled.
showDeriver :: Deriver
-- | Derives Eq.
--
-- Requires to have the StandaloneDeriving compiler extension
-- enabled.
eqDeriver :: Deriver
-- | Derives Ord.
--
-- Requires to have the StandaloneDeriving compiler extension
-- enabled.
ordDeriver :: Deriver
-- | Derives Generic.
--
-- Requires to have the StandaloneDeriving and
-- DeriveGeneric compiler extensions enabled.
genericDeriver :: Deriver
-- | Derives Data.
--
-- Requires to have the StandaloneDeriving and
-- DeriveDataTypeable compiler extensions enabled.
dataDeriver :: Deriver
-- | Derives Typeable.
--
-- Requires to have the StandaloneDeriving and
-- DeriveDataTypeable compiler extensions enabled.
typeableDeriver :: Deriver
-- | Generates Generic-based instances of Hashable.
hashableDeriver :: Deriver
-- | Derives Lift.
--
-- Requires to have the StandaloneDeriving and
-- DeriveLift compiler extensions enabled.
liftDeriver :: Deriver
-- | Derives HasField with unprefixed field names.
--
-- For each field of a product generates instances mapping to their
-- values.
--
-- For each constructor of a sum maps to a Maybe tuple of members
-- of that constructor, unless there's no members, in which case it maps
-- to Bool.
--
-- For each variant of an enum maps to Bool signaling whether the
-- value equals to it.
--
-- Please notice that if you choose to generate unprefixed record
-- field accessors, it will conflict with this deriver, since it's gonna
-- generate duplicate instances.
hasFieldDeriver :: Deriver
-- | Generates instances of IsLabel for wrappers, enums and sums,
-- providing mappings from labels to constructors.
--
-- -- Host: -- sum: -- ip: Ip -- name: Text ---- -- The following instances will be generated: -- --
-- instance a ~ Ip => IsLabel "ip" (a -> Host) where -- fromLabel = IpHost -- -- instance a ~ Text => IsLabel "name" (a -> Host) where -- fromLabel = NameHost ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. -- --
-- TransportProtocol: -- enum: -- - tcp -- - udp ---- -- The following instances will be generated: -- --
-- instance IsLabel "tcp" TransportProtocol where -- fromLabel = TcpTransportProtocol -- -- instance IsLabel "udp" TransportProtocol where -- fromLabel = UdpTransportProtocol --constructorIsLabelDeriver :: Deriver -- | Generates instances of IsLabel for enums, sums and products, -- providing accessors to their components. -- --
-- NetworkAddress: -- product: -- protocol: TransportProtocol -- host: Host -- port: Word16 ---- -- The following instances will be generated: -- --
-- instance a ~ TransportProtocol => IsLabel "protocol" (NetworkAddress -> a) where -- fromLabel (NetworkAddress a _ _) = a -- -- instance a ~ Host => IsLabel "host" (NetworkAddress -> a) where -- fromLabel (NetworkAddress _ b _) = b -- -- instance a ~ Word16 => IsLabel "port" (NetworkAddress -> a) where -- fromLabel (NetworkAddress _ _ c) = c ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. -- --
-- Host: -- sum: -- ip: Ip -- name: Text ---- -- The following instances will be generated: -- --
-- instance a ~ Maybe Ip => IsLabel "ip" (Host -> a) where -- fromLabel (IpHost a) = Just a -- fromLabel _ = Nothing -- -- instance a ~ Maybe Text => IsLabel "name" (Host -> a) where -- fromLabel (NameHost a) = Just a -- fromLabel _ = Nothing ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. -- --
-- TransportProtocol: -- enum: -- - tcp -- - udp ---- -- The following instances will be generated: -- --
-- instance a ~ Bool => IsLabel "tcp" (TransportProtocol -> a) where -- fromLabel TcpTransportProtocol = True -- fromLabel _ = False -- -- instance a ~ Bool => IsLabel "udp" (TransportProtocol -> a) where -- fromLabel UdpTransportProtocol = True -- fromLabel _ = False ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. accessorIsLabelDeriver :: Deriver -- | Generates instances of IsLabel for sums and products, providing -- mappers over their components. -- --
-- NetworkAddress: -- product: -- protocol: TransportProtocol -- host: Host -- port: Word16 ---- -- The following instances will be generated: -- --
-- instance -- mapper ~ (TransportProtocol -> TransportProtocol) => -- IsLabel "protocol" (mapper -> NetworkAddress -> NetworkAddress) -- where -- fromLabel mapper (NetworkAddress a b c) = -- NetworkAddress (mapper a) b c -- -- instance -- mapper ~ (Host -> Host) => -- IsLabel "host" (mapper -> NetworkAddress -> NetworkAddress) -- where -- fromLabel mapper (NetworkAddress a b c) = -- NetworkAddress a (mapper b) c -- -- instance -- mapper ~ (Word16 -> Word16) => -- IsLabel "port" (mapper -> NetworkAddress -> NetworkAddress) -- where -- fromLabel mapper (NetworkAddress a b c) = -- NetworkAddress a b (mapper c) ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. -- --
-- Host: -- sum: -- ip: Ip -- name: Text ---- -- The following instances will be generated: -- --
-- instance -- mapper ~ (Ip -> Ip) => -- IsLabel "ip" (mapper -> Host -> Host) -- where -- fromLabel fn (IpHost a) = IpHost (fn a) -- fromLabel _ a = a -- -- instance -- mapper ~ (Text -> Text) => -- IsLabel "name" (mapper -> Host -> Host) -- where -- fromLabel fn (NameHost a) = NameHost (fn a) -- fromLabel _ a = a ---- -- In case you're wondering what this tilde (~) constraint -- business is about, refer to the Type Equality Constraint -- section. mapperIsLabelDeriver :: Deriver instance Language.Haskell.TH.Syntax.Lift Domain.Schema module Domain.Docs