{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module System.Nix.Arbitrary.OutputName where

import System.Nix.OutputName (OutputName)
import qualified Data.Text
import qualified System.Nix.OutputName

import Test.QuickCheck (Arbitrary(arbitrary), choose, elements, vectorOf)

instance Arbitrary OutputName where
  arbitrary :: Gen OutputName
arbitrary =
      (InvalidNameError -> OutputName)
-> (OutputName -> OutputName)
-> Either InvalidNameError OutputName
-> OutputName
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([Char] -> OutputName
forall a. HasCallStack => [Char] -> a
error ([Char] -> OutputName)
-> (InvalidNameError -> [Char]) -> InvalidNameError -> OutputName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InvalidNameError -> [Char]
forall a. Show a => a -> [Char]
show) OutputName -> OutputName
forall a. a -> a
id
    (Either InvalidNameError OutputName -> OutputName)
-> ([Char] -> Either InvalidNameError OutputName)
-> [Char]
-> OutputName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either InvalidNameError OutputName
System.Nix.OutputName.mkOutputName
    (Text -> Either InvalidNameError OutputName)
-> ([Char] -> Text) -> [Char] -> Either InvalidNameError OutputName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
Data.Text.pack ([Char] -> OutputName) -> Gen [Char] -> Gen OutputName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((:) (Char -> [Char] -> [Char]) -> Gen Char -> Gen ([Char] -> [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Char
s1 Gen ([Char] -> [Char]) -> Gen [Char] -> Gen [Char]
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Char -> Gen [Char]
forall {a}. Gen a -> Gen [a]
limited Gen Char
sn)
   where
    alphanum :: [Char]
alphanum = [Char
'a' .. Char
'z'] [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char
'A' .. Char
'Z'] [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char
'0' .. Char
'9']
    s1 :: Gen Char
s1 = [Char] -> Gen Char
forall a. HasCallStack => [a] -> Gen a
elements ([Char] -> Gen Char) -> [Char] -> Gen Char
forall a b. (a -> b) -> a -> b
$ [Char]
alphanum [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"+-_?="
    sn :: Gen Char
sn = [Char] -> Gen Char
forall a. HasCallStack => [a] -> Gen a
elements ([Char] -> Gen Char) -> [Char] -> Gen Char
forall a b. (a -> b) -> a -> b
$ [Char]
alphanum [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"+-._?="
    limited :: Gen a -> Gen [a]
limited Gen a
n = do
      Int
k <- (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
210)
      Int -> Gen a -> Gen [a]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
k Gen a
n