module Unison.Syntax.Var
  ( namespaced,
    namespaced2,
  )
where

import Data.List.NonEmpty (pattern (:|))
import Data.List.NonEmpty qualified as List (NonEmpty)
import Unison.Name qualified as Name
import Unison.Prelude
import Unison.Syntax.Name qualified as Name
import Unison.Var (Var)

namespaced :: (Var v) => List.NonEmpty v -> v
namespaced :: forall v. Var v => NonEmpty v -> v
namespaced (v
v :| [v]
vs) =
  Name -> v
forall v. Var v => Name -> v
Name.toVar ((Name -> Name -> Name) -> Name -> [Name] -> Name
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' HasCallStack => Name -> Name -> Name
Name -> Name -> Name
Name.joinDot (v -> Name
forall v. Var v => v -> Name
Name.unsafeParseVar v
v) ((v -> Name) -> [v] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map v -> Name
forall v. Var v => v -> Name
Name.unsafeParseVar [v]
vs))

-- | Like 'namespaced', but for the common case that you have two vars to join.
namespaced2 :: (Var v) => v -> v -> v
namespaced2 :: forall v. Var v => v -> v -> v
namespaced2 v
v1 v
v2 =
  NonEmpty v -> v
forall v. Var v => NonEmpty v -> v
namespaced (v
v1 v -> [v] -> NonEmpty v
forall a. a -> [a] -> NonEmpty a
:| [v
v2])