-- SPDX-FileCopyrightText: 2022 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

{-# OPTIONS_GHC -Wno-orphans #-}

-- | One place for orphan instances
module Hedgehog.Range.Defaults.Orphans
  () where

import Data.Default (Default(..))
import Hedgehog.Range (Range)
import Hedgehog.Range qualified as Range

import Morley.Michelson.ErrorPos (Pos(..))
import Morley.Michelson.Typed (T(..), Value'(..))
import Morley.Michelson.Untyped (StackRef(..))
import Morley.Tezos.Core (Mutez(..), Timestamp, timestampFromSeconds, timestampToSeconds)

import Hedgehog.Range.Tezos.Core.Timestamp
import Test.Cleveland.Instances ()

instance Default (Range Pos) where
  def :: Range Pos
def = Word -> Pos
Pos (Word -> Pos) -> Range Word -> Range Pos
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Word
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

instance Default (Range StackRef) where
  def :: Range StackRef
def = Natural -> StackRef
StackRef (Natural -> StackRef) -> Range Natural -> Range StackRef
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Natural -> Natural -> Range Natural
forall a. Integral a => a -> a -> Range a
Range.linear Natural
0 (Word64 -> Natural
forall a b. (Integral a, Integral b, CheckIntSubType a b) => a -> b
fromIntegral (Word64 -> Natural) -> Word64 -> Natural
forall a b. (a -> b) -> a -> b
$ forall a. Bounded a => a
maxBound @Word64)

instance Default (Range Mutez) where
  def :: Range Mutez
def = Range Mutez
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

instance Default (Range Timestamp) where
  def :: Range Timestamp
def = Integer -> Timestamp
timestampFromSeconds (Integer -> Timestamp) -> Range Integer -> Range Timestamp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
    Integer -> Integer -> Range Integer
forall a. Integral a => a -> a -> Range a
Range.linear (Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
minTimestamp) (Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
maxTimestamp)

instance Default (Range (Value' instr 'TInt)) where
  def :: Range (Value' instr 'TInt)
def = Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer -> Value' instr 'TInt)
-> Range Integer -> Range (Value' instr 'TInt)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Integer -> Integer -> Range Integer
forall a. Integral a => a -> a -> a -> Range a
Range.linearFrom Integer
0 Integer
-1000 Integer
1000

instance Default (Range (Value' instr 'TNat)) where
  def :: Range (Value' instr 'TNat)
def = Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural -> Value' instr 'TNat)
-> Range Natural -> Range (Value' instr 'TNat)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Natural -> Natural -> Natural -> Range Natural
forall a. Integral a => a -> a -> a -> Range a
Range.linearFrom Natural
0 Natural
0 Natural
1000