module Unison.Blank
  ( Blank (..),
    Recorded (..),
    loc,
    nameb,
  )
where

import Unison.Prelude

loc :: Recorded loc -> loc
loc :: forall loc. Recorded loc -> loc
loc (Placeholder loc
loc String
_) = loc
loc
loc (Resolve loc
loc String
_) = loc
loc
loc (MissingResultPlaceholder loc
loc) = loc
loc

nameb :: Blank loc -> Maybe String
nameb :: forall loc. Blank loc -> Maybe String
nameb (Recorded (Placeholder loc
_ String
n)) = String -> Maybe String
forall a. a -> Maybe a
Just String
n
nameb (Recorded (Resolve loc
_ String
n)) = String -> Maybe String
forall a. a -> Maybe a
Just String
n
nameb Blank loc
_ = Maybe String
forall a. Maybe a
Nothing

data Recorded loc
  = -- A user-provided named placeholder
    Placeholder loc String
  | -- A name to be resolved with type-directed name resolution.
    Resolve loc String
  | -- A placeholder for a missing result at the end of a block
    MissingResultPlaceholder loc
  deriving (Int -> Recorded loc -> ShowS
[Recorded loc] -> ShowS
Recorded loc -> String
(Int -> Recorded loc -> ShowS)
-> (Recorded loc -> String)
-> ([Recorded loc] -> ShowS)
-> Show (Recorded loc)
forall loc. Show loc => Int -> Recorded loc -> ShowS
forall loc. Show loc => [Recorded loc] -> ShowS
forall loc. Show loc => Recorded loc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall loc. Show loc => Int -> Recorded loc -> ShowS
showsPrec :: Int -> Recorded loc -> ShowS
$cshow :: forall loc. Show loc => Recorded loc -> String
show :: Recorded loc -> String
$cshowList :: forall loc. Show loc => [Recorded loc] -> ShowS
showList :: [Recorded loc] -> ShowS
Show, Recorded loc -> Recorded loc -> Bool
(Recorded loc -> Recorded loc -> Bool)
-> (Recorded loc -> Recorded loc -> Bool) -> Eq (Recorded loc)
forall loc. Eq loc => Recorded loc -> Recorded loc -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall loc. Eq loc => Recorded loc -> Recorded loc -> Bool
== :: Recorded loc -> Recorded loc -> Bool
$c/= :: forall loc. Eq loc => Recorded loc -> Recorded loc -> Bool
/= :: Recorded loc -> Recorded loc -> Bool
Eq, Eq (Recorded loc)
Eq (Recorded loc) =>
(Recorded loc -> Recorded loc -> Ordering)
-> (Recorded loc -> Recorded loc -> Bool)
-> (Recorded loc -> Recorded loc -> Bool)
-> (Recorded loc -> Recorded loc -> Bool)
-> (Recorded loc -> Recorded loc -> Bool)
-> (Recorded loc -> Recorded loc -> Recorded loc)
-> (Recorded loc -> Recorded loc -> Recorded loc)
-> Ord (Recorded loc)
Recorded loc -> Recorded loc -> Bool
Recorded loc -> Recorded loc -> Ordering
Recorded loc -> Recorded loc -> Recorded loc
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 loc. Ord loc => Eq (Recorded loc)
forall loc. Ord loc => Recorded loc -> Recorded loc -> Bool
forall loc. Ord loc => Recorded loc -> Recorded loc -> Ordering
forall loc. Ord loc => Recorded loc -> Recorded loc -> Recorded loc
$ccompare :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Ordering
compare :: Recorded loc -> Recorded loc -> Ordering
$c< :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Bool
< :: Recorded loc -> Recorded loc -> Bool
$c<= :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Bool
<= :: Recorded loc -> Recorded loc -> Bool
$c> :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Bool
> :: Recorded loc -> Recorded loc -> Bool
$c>= :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Bool
>= :: Recorded loc -> Recorded loc -> Bool
$cmax :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Recorded loc
max :: Recorded loc -> Recorded loc -> Recorded loc
$cmin :: forall loc. Ord loc => Recorded loc -> Recorded loc -> Recorded loc
min :: Recorded loc -> Recorded loc -> Recorded loc
Ord, (forall a b. (a -> b) -> Recorded a -> Recorded b)
-> (forall a b. a -> Recorded b -> Recorded a) -> Functor Recorded
forall a b. a -> Recorded b -> Recorded a
forall a b. (a -> b) -> Recorded a -> Recorded b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Recorded a -> Recorded b
fmap :: forall a b. (a -> b) -> Recorded a -> Recorded b
$c<$ :: forall a b. a -> Recorded b -> Recorded a
<$ :: forall a b. a -> Recorded b -> Recorded a
Functor, (forall x. Recorded loc -> Rep (Recorded loc) x)
-> (forall x. Rep (Recorded loc) x -> Recorded loc)
-> Generic (Recorded loc)
forall x. Rep (Recorded loc) x -> Recorded loc
forall x. Recorded loc -> Rep (Recorded loc) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall loc x. Rep (Recorded loc) x -> Recorded loc
forall loc x. Recorded loc -> Rep (Recorded loc) x
$cfrom :: forall loc x. Recorded loc -> Rep (Recorded loc) x
from :: forall x. Recorded loc -> Rep (Recorded loc) x
$cto :: forall loc x. Rep (Recorded loc) x -> Recorded loc
to :: forall x. Rep (Recorded loc) x -> Recorded loc
Generic)

-- | Blank is just a dummy annotation.
data Blank loc
  = -- | just a dummy annotation
    Blank
  | -- | indicates that we want to remember the variable's solution for
    -- some reason
    Recorded (Recorded loc)
  | -- | indicates that we want to prefer keeping the variable in the
    -- context to better refine the above recorded solutions
    Retain
  deriving (Int -> Blank loc -> ShowS
[Blank loc] -> ShowS
Blank loc -> String
(Int -> Blank loc -> ShowS)
-> (Blank loc -> String)
-> ([Blank loc] -> ShowS)
-> Show (Blank loc)
forall loc. Show loc => Int -> Blank loc -> ShowS
forall loc. Show loc => [Blank loc] -> ShowS
forall loc. Show loc => Blank loc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall loc. Show loc => Int -> Blank loc -> ShowS
showsPrec :: Int -> Blank loc -> ShowS
$cshow :: forall loc. Show loc => Blank loc -> String
show :: Blank loc -> String
$cshowList :: forall loc. Show loc => [Blank loc] -> ShowS
showList :: [Blank loc] -> ShowS
Show, Blank loc -> Blank loc -> Bool
(Blank loc -> Blank loc -> Bool)
-> (Blank loc -> Blank loc -> Bool) -> Eq (Blank loc)
forall loc. Eq loc => Blank loc -> Blank loc -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall loc. Eq loc => Blank loc -> Blank loc -> Bool
== :: Blank loc -> Blank loc -> Bool
$c/= :: forall loc. Eq loc => Blank loc -> Blank loc -> Bool
/= :: Blank loc -> Blank loc -> Bool
Eq, Eq (Blank loc)
Eq (Blank loc) =>
(Blank loc -> Blank loc -> Ordering)
-> (Blank loc -> Blank loc -> Bool)
-> (Blank loc -> Blank loc -> Bool)
-> (Blank loc -> Blank loc -> Bool)
-> (Blank loc -> Blank loc -> Bool)
-> (Blank loc -> Blank loc -> Blank loc)
-> (Blank loc -> Blank loc -> Blank loc)
-> Ord (Blank loc)
Blank loc -> Blank loc -> Bool
Blank loc -> Blank loc -> Ordering
Blank loc -> Blank loc -> Blank loc
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 loc. Ord loc => Eq (Blank loc)
forall loc. Ord loc => Blank loc -> Blank loc -> Bool
forall loc. Ord loc => Blank loc -> Blank loc -> Ordering
forall loc. Ord loc => Blank loc -> Blank loc -> Blank loc
$ccompare :: forall loc. Ord loc => Blank loc -> Blank loc -> Ordering
compare :: Blank loc -> Blank loc -> Ordering
$c< :: forall loc. Ord loc => Blank loc -> Blank loc -> Bool
< :: Blank loc -> Blank loc -> Bool
$c<= :: forall loc. Ord loc => Blank loc -> Blank loc -> Bool
<= :: Blank loc -> Blank loc -> Bool
$c> :: forall loc. Ord loc => Blank loc -> Blank loc -> Bool
> :: Blank loc -> Blank loc -> Bool
$c>= :: forall loc. Ord loc => Blank loc -> Blank loc -> Bool
>= :: Blank loc -> Blank loc -> Bool
$cmax :: forall loc. Ord loc => Blank loc -> Blank loc -> Blank loc
max :: Blank loc -> Blank loc -> Blank loc
$cmin :: forall loc. Ord loc => Blank loc -> Blank loc -> Blank loc
min :: Blank loc -> Blank loc -> Blank loc
Ord, (forall a b. (a -> b) -> Blank a -> Blank b)
-> (forall a b. a -> Blank b -> Blank a) -> Functor Blank
forall a b. a -> Blank b -> Blank a
forall a b. (a -> b) -> Blank a -> Blank b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Blank a -> Blank b
fmap :: forall a b. (a -> b) -> Blank a -> Blank b
$c<$ :: forall a b. a -> Blank b -> Blank a
<$ :: forall a b. a -> Blank b -> Blank a
Functor, (forall x. Blank loc -> Rep (Blank loc) x)
-> (forall x. Rep (Blank loc) x -> Blank loc)
-> Generic (Blank loc)
forall x. Rep (Blank loc) x -> Blank loc
forall x. Blank loc -> Rep (Blank loc) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall loc x. Rep (Blank loc) x -> Blank loc
forall loc x. Blank loc -> Rep (Blank loc) x
$cfrom :: forall loc x. Blank loc -> Rep (Blank loc) x
from :: forall x. Blank loc -> Rep (Blank loc) x
$cto :: forall loc x. Rep (Blank loc) x -> Blank loc
to :: forall x. Rep (Blank loc) x -> Blank loc
Generic)