packages feed

fakedata-1.0.4: src/Faker/Company.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Faker.Company
  ( buzzword
  , suffix
  , bs
  , name
  , industry
  , profession
  , type'
  , sicCode
  , email
  , domain
  ) where

import Data.Monoid ((<>))
import Data.Text (Text)
import qualified Data.Text as T 
import qualified Data.Vector as V
import Faker
import Faker.Internal
import Faker.Provider.Company
import Faker.TH
import qualified Faker.Internet as F
import qualified Faker.Name as F
import qualified Faker.Combinators as F
import Data.Char(isAlphaNum)

$(generateFakeField "company" "suffix")

buzzword :: Fake Text
buzzword =
  Fake
    (\settings -> do
       vec :: V.Vector (V.Vector Text) <- companyBuzzwordsProvider settings
       let item :: IO (V.Vector Text) = rvec settings vec
       item' <- item
       rvec settings item')

bs :: Fake Text
bs =
  Fake
    (\settings -> do
       vec :: V.Vector (V.Vector Text) <- companyBsProvider settings
       let item :: V.Vector (IO Text) = V.map (rvec settings) vec
           item' :: IO (V.Vector Text) = sequence item
       items <- item'
       let txt = V.foldl1' (\a b -> a <> " " <> b) items
       pure txt)

$(generateFakeFieldUnresolved "company" "name")

$(generateFakeField "company" "industry")

$(generateFakeField "company" "profession")

$(generateFakeField "company" "type")

-- | SIC code for classifying industries.
--
-- @since 0.2.0
--
$(generateFakeField "company" "sic_code")

-- | Generates a domain name like "crazychairauction.com"
--
-- @since 0.8.1
--
domain :: Fake Text
domain = do
  suffix <- F.domainSuffix
  companyName <- name
  pure $ sanitise companyName <> "." <> suffix
  where
  -- Replaces spaces with hyphens and filters out anything that isn't an
  -- alphanumeric character or a hyphen, so the domain has a better chance of
  -- conforming to RFC 1035.
  --
  -- See: https://datatracker.ietf.org/doc/html/rfc1035#section-2.3.1
  sanitise :: Text -> Text
  sanitise = T.filter (\c -> isAlphaNum c || c == '-') . T.replace " " "-"

-- | Generates an email like "jappie_klooster@crazychairauction.com"
--
-- @since 0.8.1
email :: Fake Text
email = do
  humanName <-  F.name
  number <- F.fromRange @Int (0, 999999999) -- reasonable uniqueness
  domainName <- domain
  let numText :: Text
      numText = T.pack $ show number
  pure $ sanitise humanName <> "-" <> numText <> "@" <> domainName
  where
  -- Ensures the spaces are replaced by "_",
  -- and no special characters are in the name.
  -- So "Elizabeth Warder!" becomes "Elizabeth_Warder".
  -- Any fancy symbols such as "!@#$" etc are filtered out.
  sanitise :: Text -> Text
  sanitise = T.filter (\c -> isAlphaNum c || c == '_') . T.replace " " "_"