{-# language DeriveAnyClass #-} {-# language DeriveGeneric #-} {-# language DerivingStrategies #-} {-# language GeneralizedNewtypeDeriving #-} {-# language OverloadedStrings #-} {-# language ViewPatterns #-} module Language.Elm.Name where import Data.Bifunctor import qualified Data.Char as Char import Data.Hashable import Data.String import Data.Text (Text) import qualified Data.Text as Text import GHC.Generics (Generic) type Module = [Text] newtype Local = Local Text deriving stock (Local -> Local -> Bool (Local -> Local -> Bool) -> (Local -> Local -> Bool) -> Eq Local forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Local -> Local -> Bool $c/= :: Local -> Local -> Bool == :: Local -> Local -> Bool $c== :: Local -> Local -> Bool Eq, Eq Local Eq Local -> (Local -> Local -> Ordering) -> (Local -> Local -> Bool) -> (Local -> Local -> Bool) -> (Local -> Local -> Bool) -> (Local -> Local -> Bool) -> (Local -> Local -> Local) -> (Local -> Local -> Local) -> Ord Local Local -> Local -> Bool Local -> Local -> Ordering Local -> Local -> Local 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 min :: Local -> Local -> Local $cmin :: Local -> Local -> Local max :: Local -> Local -> Local $cmax :: Local -> Local -> Local >= :: Local -> Local -> Bool $c>= :: Local -> Local -> Bool > :: Local -> Local -> Bool $c> :: Local -> Local -> Bool <= :: Local -> Local -> Bool $c<= :: Local -> Local -> Bool < :: Local -> Local -> Bool $c< :: Local -> Local -> Bool compare :: Local -> Local -> Ordering $ccompare :: Local -> Local -> Ordering $cp1Ord :: Eq Local Ord, Int -> Local -> ShowS [Local] -> ShowS Local -> String (Int -> Local -> ShowS) -> (Local -> String) -> ([Local] -> ShowS) -> Show Local forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Local] -> ShowS $cshowList :: [Local] -> ShowS show :: Local -> String $cshow :: Local -> String showsPrec :: Int -> Local -> ShowS $cshowsPrec :: Int -> Local -> ShowS Show, (forall x. Local -> Rep Local x) -> (forall x. Rep Local x -> Local) -> Generic Local forall x. Rep Local x -> Local forall x. Local -> Rep Local x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep Local x -> Local $cfrom :: forall x. Local -> Rep Local x Generic) deriving newtype (String -> Local (String -> Local) -> IsString Local forall a. (String -> a) -> IsString a fromString :: String -> Local $cfromString :: String -> Local IsString) deriving anyclass (Int -> Local -> Int Local -> Int (Int -> Local -> Int) -> (Local -> Int) -> Hashable Local forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a hash :: Local -> Int $chash :: Local -> Int hashWithSalt :: Int -> Local -> Int $chashWithSalt :: Int -> Local -> Int Hashable) data Qualified = Qualified Module Text deriving (Qualified -> Qualified -> Bool (Qualified -> Qualified -> Bool) -> (Qualified -> Qualified -> Bool) -> Eq Qualified forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Qualified -> Qualified -> Bool $c/= :: Qualified -> Qualified -> Bool == :: Qualified -> Qualified -> Bool $c== :: Qualified -> Qualified -> Bool Eq, Eq Qualified Eq Qualified -> (Qualified -> Qualified -> Ordering) -> (Qualified -> Qualified -> Bool) -> (Qualified -> Qualified -> Bool) -> (Qualified -> Qualified -> Bool) -> (Qualified -> Qualified -> Bool) -> (Qualified -> Qualified -> Qualified) -> (Qualified -> Qualified -> Qualified) -> Ord Qualified Qualified -> Qualified -> Bool Qualified -> Qualified -> Ordering Qualified -> Qualified -> Qualified 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 min :: Qualified -> Qualified -> Qualified $cmin :: Qualified -> Qualified -> Qualified max :: Qualified -> Qualified -> Qualified $cmax :: Qualified -> Qualified -> Qualified >= :: Qualified -> Qualified -> Bool $c>= :: Qualified -> Qualified -> Bool > :: Qualified -> Qualified -> Bool $c> :: Qualified -> Qualified -> Bool <= :: Qualified -> Qualified -> Bool $c<= :: Qualified -> Qualified -> Bool < :: Qualified -> Qualified -> Bool $c< :: Qualified -> Qualified -> Bool compare :: Qualified -> Qualified -> Ordering $ccompare :: Qualified -> Qualified -> Ordering $cp1Ord :: Eq Qualified Ord, Int -> Qualified -> ShowS [Qualified] -> ShowS Qualified -> String (Int -> Qualified -> ShowS) -> (Qualified -> String) -> ([Qualified] -> ShowS) -> Show Qualified forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Qualified] -> ShowS $cshowList :: [Qualified] -> ShowS show :: Qualified -> String $cshow :: Qualified -> String showsPrec :: Int -> Qualified -> ShowS $cshowsPrec :: Int -> Qualified -> ShowS Show, (forall x. Qualified -> Rep Qualified x) -> (forall x. Rep Qualified x -> Qualified) -> Generic Qualified forall x. Rep Qualified x -> Qualified forall x. Qualified -> Rep Qualified x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep Qualified x -> Qualified $cfrom :: forall x. Qualified -> Rep Qualified x Generic) deriving anyclass (Int -> Qualified -> Int Qualified -> Int (Int -> Qualified -> Int) -> (Qualified -> Int) -> Hashable Qualified forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a hash :: Qualified -> Int $chash :: Qualified -> Int hashWithSalt :: Int -> Qualified -> Int $chashWithSalt :: Int -> Qualified -> Int Hashable) newtype Field = Field Text deriving stock (Field -> Field -> Bool (Field -> Field -> Bool) -> (Field -> Field -> Bool) -> Eq Field forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Field -> Field -> Bool $c/= :: Field -> Field -> Bool == :: Field -> Field -> Bool $c== :: Field -> Field -> Bool Eq, Eq Field Eq Field -> (Field -> Field -> Ordering) -> (Field -> Field -> Bool) -> (Field -> Field -> Bool) -> (Field -> Field -> Bool) -> (Field -> Field -> Bool) -> (Field -> Field -> Field) -> (Field -> Field -> Field) -> Ord Field Field -> Field -> Bool Field -> Field -> Ordering Field -> Field -> Field 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 min :: Field -> Field -> Field $cmin :: Field -> Field -> Field max :: Field -> Field -> Field $cmax :: Field -> Field -> Field >= :: Field -> Field -> Bool $c>= :: Field -> Field -> Bool > :: Field -> Field -> Bool $c> :: Field -> Field -> Bool <= :: Field -> Field -> Bool $c<= :: Field -> Field -> Bool < :: Field -> Field -> Bool $c< :: Field -> Field -> Bool compare :: Field -> Field -> Ordering $ccompare :: Field -> Field -> Ordering $cp1Ord :: Eq Field Ord, Int -> Field -> ShowS [Field] -> ShowS Field -> String (Int -> Field -> ShowS) -> (Field -> String) -> ([Field] -> ShowS) -> Show Field forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Field] -> ShowS $cshowList :: [Field] -> ShowS show :: Field -> String $cshow :: Field -> String showsPrec :: Int -> Field -> ShowS $cshowsPrec :: Int -> Field -> ShowS Show, (forall x. Field -> Rep Field x) -> (forall x. Rep Field x -> Field) -> Generic Field forall x. Rep Field x -> Field forall x. Field -> Rep Field x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep Field x -> Field $cfrom :: forall x. Field -> Rep Field x Generic) deriving newtype (String -> Field (String -> Field) -> IsString Field forall a. (String -> a) -> IsString a fromString :: String -> Field $cfromString :: String -> Field IsString) deriving anyclass (Int -> Field -> Int Field -> Int (Int -> Field -> Int) -> (Field -> Int) -> Hashable Field forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a hash :: Field -> Int $chash :: Field -> Int hashWithSalt :: Int -> Field -> Int $chashWithSalt :: Int -> Field -> Int Hashable) newtype Constructor = Constructor Text deriving stock (Constructor -> Constructor -> Bool (Constructor -> Constructor -> Bool) -> (Constructor -> Constructor -> Bool) -> Eq Constructor forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Constructor -> Constructor -> Bool $c/= :: Constructor -> Constructor -> Bool == :: Constructor -> Constructor -> Bool $c== :: Constructor -> Constructor -> Bool Eq, Eq Constructor Eq Constructor -> (Constructor -> Constructor -> Ordering) -> (Constructor -> Constructor -> Bool) -> (Constructor -> Constructor -> Bool) -> (Constructor -> Constructor -> Bool) -> (Constructor -> Constructor -> Bool) -> (Constructor -> Constructor -> Constructor) -> (Constructor -> Constructor -> Constructor) -> Ord Constructor Constructor -> Constructor -> Bool Constructor -> Constructor -> Ordering Constructor -> Constructor -> Constructor 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 min :: Constructor -> Constructor -> Constructor $cmin :: Constructor -> Constructor -> Constructor max :: Constructor -> Constructor -> Constructor $cmax :: Constructor -> Constructor -> Constructor >= :: Constructor -> Constructor -> Bool $c>= :: Constructor -> Constructor -> Bool > :: Constructor -> Constructor -> Bool $c> :: Constructor -> Constructor -> Bool <= :: Constructor -> Constructor -> Bool $c<= :: Constructor -> Constructor -> Bool < :: Constructor -> Constructor -> Bool $c< :: Constructor -> Constructor -> Bool compare :: Constructor -> Constructor -> Ordering $ccompare :: Constructor -> Constructor -> Ordering $cp1Ord :: Eq Constructor Ord, Int -> Constructor -> ShowS [Constructor] -> ShowS Constructor -> String (Int -> Constructor -> ShowS) -> (Constructor -> String) -> ([Constructor] -> ShowS) -> Show Constructor forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Constructor] -> ShowS $cshowList :: [Constructor] -> ShowS show :: Constructor -> String $cshow :: Constructor -> String showsPrec :: Int -> Constructor -> ShowS $cshowsPrec :: Int -> Constructor -> ShowS Show, (forall x. Constructor -> Rep Constructor x) -> (forall x. Rep Constructor x -> Constructor) -> Generic Constructor forall x. Rep Constructor x -> Constructor forall x. Constructor -> Rep Constructor x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep Constructor x -> Constructor $cfrom :: forall x. Constructor -> Rep Constructor x Generic) deriving newtype (String -> Constructor (String -> Constructor) -> IsString Constructor forall a. (String -> a) -> IsString a fromString :: String -> Constructor $cfromString :: String -> Constructor IsString) deriving anyclass (Int -> Constructor -> Int Constructor -> Int (Int -> Constructor -> Int) -> (Constructor -> Int) -> Hashable Constructor forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a hash :: Constructor -> Int $chash :: Constructor -> Int hashWithSalt :: Int -> Constructor -> Int $chashWithSalt :: Int -> Constructor -> Int Hashable) isConstructor :: Qualified -> Bool isConstructor :: Qualified -> Bool isConstructor Qualified name = case Qualified name of Qualified "List.::" -> Bool True Qualified "Basics.," -> Bool True Qualified "Basics.()" -> Bool True Qualified Module _ (Text -> Maybe (Char, Text) Text.uncons -> Just (Char firstChar, Text _)) -> Char -> Bool Char.isUpper Char firstChar Qualified _ -> Bool False instance IsString Qualified where fromString :: String -> Qualified fromString String s = case Module -> Maybe (Module, Text) forall a. [a] -> Maybe ([a], a) unsnoc (Module -> Maybe (Module, Text)) -> Module -> Maybe (Module, Text) forall a b. (a -> b) -> a -> b $ Text -> Text -> Module Text.splitOn Text "." (Text -> Module) -> Text -> Module forall a b. (a -> b) -> a -> b $ String -> Text forall a. IsString a => String -> a fromString String s of Maybe (Module, Text) Nothing -> String -> Qualified forall a. HasCallStack => String -> a error String "Empty name" Just ([], Text x) -> String -> Qualified forall a. HasCallStack => String -> a error (String -> Qualified) -> String -> Qualified forall a b. (a -> b) -> a -> b $ String "Unqualified name " String -> ShowS forall a. Semigroup a => a -> a -> a <> Text -> String forall a. Show a => a -> String show Text x Just (Module xs, Text x) -> Module -> Text -> Qualified Qualified Module xs Text x where unsnoc :: [a] -> Maybe ([a], a) unsnoc :: [a] -> Maybe ([a], a) unsnoc [] = Maybe ([a], a) forall a. Maybe a Nothing unsnoc (a a:[a] as) = ([a], a) -> Maybe ([a], a) forall a. a -> Maybe a Just (([a], a) -> Maybe ([a], a)) -> ([a], a) -> Maybe ([a], a) forall a b. (a -> b) -> a -> b $ a -> [a] -> ([a], a) forall a. a -> [a] -> ([a], a) go a a [a] as go :: a -> [a] -> ([a], a) go :: a -> [a] -> ([a], a) go a a [] = ([], a a) go a a (a a':[a] as) = ([a] -> [a]) -> ([a], a) -> ([a], a) forall (p :: * -> * -> *) a b c. Bifunctor p => (a -> b) -> p a c -> p b c first (a aa -> [a] -> [a] forall a. a -> [a] -> [a] :) (([a], a) -> ([a], a)) -> ([a], a) -> ([a], a) forall a b. (a -> b) -> a -> b $ a -> [a] -> ([a], a) forall a. a -> [a] -> ([a], a) go a a' [a] as