module Unison.OrBuiltin
  ( OrBuiltin (..),
    builtin_,
    notBuiltin_,
  )
where

import Control.Lens (Traversal)

data OrBuiltin a b
  = Builtin a
  | NotBuiltin b
  deriving stock (OrBuiltin a b -> OrBuiltin a b -> Bool
(OrBuiltin a b -> OrBuiltin a b -> Bool)
-> (OrBuiltin a b -> OrBuiltin a b -> Bool) -> Eq (OrBuiltin a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => OrBuiltin a b -> OrBuiltin a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => OrBuiltin a b -> OrBuiltin a b -> Bool
== :: OrBuiltin a b -> OrBuiltin a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => OrBuiltin a b -> OrBuiltin a b -> Bool
/= :: OrBuiltin a b -> OrBuiltin a b -> Bool
Eq, Eq (OrBuiltin a b)
Eq (OrBuiltin a b) =>
(OrBuiltin a b -> OrBuiltin a b -> Ordering)
-> (OrBuiltin a b -> OrBuiltin a b -> Bool)
-> (OrBuiltin a b -> OrBuiltin a b -> Bool)
-> (OrBuiltin a b -> OrBuiltin a b -> Bool)
-> (OrBuiltin a b -> OrBuiltin a b -> Bool)
-> (OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b)
-> (OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b)
-> Ord (OrBuiltin a b)
OrBuiltin a b -> OrBuiltin a b -> Bool
OrBuiltin a b -> OrBuiltin a b -> Ordering
OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a b. (Ord a, Ord b) => Eq (OrBuiltin a b)
forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Bool
forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Ordering
forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
$ccompare :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Ordering
compare :: OrBuiltin a b -> OrBuiltin a b -> Ordering
$c< :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Bool
< :: OrBuiltin a b -> OrBuiltin a b -> Bool
$c<= :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Bool
<= :: OrBuiltin a b -> OrBuiltin a b -> Bool
$c> :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Bool
> :: OrBuiltin a b -> OrBuiltin a b -> Bool
$c>= :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> Bool
>= :: OrBuiltin a b -> OrBuiltin a b -> Bool
$cmax :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
max :: OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
$cmin :: forall a b.
(Ord a, Ord b) =>
OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
min :: OrBuiltin a b -> OrBuiltin a b -> OrBuiltin a b
Ord, Int -> OrBuiltin a b -> ShowS
[OrBuiltin a b] -> ShowS
OrBuiltin a b -> String
(Int -> OrBuiltin a b -> ShowS)
-> (OrBuiltin a b -> String)
-> ([OrBuiltin a b] -> ShowS)
-> Show (OrBuiltin a b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b. (Show a, Show b) => Int -> OrBuiltin a b -> ShowS
forall a b. (Show a, Show b) => [OrBuiltin a b] -> ShowS
forall a b. (Show a, Show b) => OrBuiltin a b -> String
$cshowsPrec :: forall a b. (Show a, Show b) => Int -> OrBuiltin a b -> ShowS
showsPrec :: Int -> OrBuiltin a b -> ShowS
$cshow :: forall a b. (Show a, Show b) => OrBuiltin a b -> String
show :: OrBuiltin a b -> String
$cshowList :: forall a b. (Show a, Show b) => [OrBuiltin a b] -> ShowS
showList :: [OrBuiltin a b] -> ShowS
Show)

builtin_ :: Traversal (OrBuiltin a b) (OrBuiltin a' b) a a'
builtin_ :: forall a b a' (f :: * -> *).
Applicative f =>
(a -> f a') -> OrBuiltin a b -> f (OrBuiltin a' b)
builtin_ a -> f a'
f = \case
  Builtin a
x -> a' -> OrBuiltin a' b
forall a b. a -> OrBuiltin a b
Builtin (a' -> OrBuiltin a' b) -> f a' -> f (OrBuiltin a' b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f a'
f a
x
  NotBuiltin b
x -> OrBuiltin a' b -> f (OrBuiltin a' b)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> OrBuiltin a' b
forall a b. b -> OrBuiltin a b
NotBuiltin b
x)

notBuiltin_ :: Traversal (OrBuiltin a b) (OrBuiltin a b') b b'
notBuiltin_ :: forall a b b' (f :: * -> *).
Applicative f =>
(b -> f b') -> OrBuiltin a b -> f (OrBuiltin a b')
notBuiltin_ b -> f b'
f = \case
  Builtin a
x -> OrBuiltin a b' -> f (OrBuiltin a b')
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> OrBuiltin a b'
forall a b. a -> OrBuiltin a b
Builtin a
x)
  NotBuiltin b
x -> b' -> OrBuiltin a b'
forall a b. b -> OrBuiltin a b
NotBuiltin (b' -> OrBuiltin a b') -> f b' -> f (OrBuiltin a b')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> f b'
f b
x