-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>
--
-- SPDX-License-Identifier: GPL-3.0-only

module Language.QBE.Backend
  ( SolverError (..),
    prefixLength,
  )
where

import Control.Exception (Exception)

data SolverError
  = UnknownResult
  deriving (Int -> SolverError -> ShowS
[SolverError] -> ShowS
SolverError -> String
(Int -> SolverError -> ShowS)
-> (SolverError -> String)
-> ([SolverError] -> ShowS)
-> Show SolverError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SolverError -> ShowS
showsPrec :: Int -> SolverError -> ShowS
$cshow :: SolverError -> String
show :: SolverError -> String
$cshowList :: [SolverError] -> ShowS
showList :: [SolverError] -> ShowS
Show)

instance Exception SolverError

------------------------------------------------------------------------

-- | Determine the length of the common prefix of two lists.
prefixLength :: (Eq a) => [a] -> [a] -> Int
prefixLength :: forall a. Eq a => [a] -> [a] -> Int
prefixLength = Int -> [a] -> [a] -> Int
forall a. Eq a => Int -> [a] -> [a] -> Int
prefixLength' Int
0
  where
    prefixLength' :: (Eq a) => Int -> [a] -> [a] -> Int
    prefixLength' :: forall a. Eq a => Int -> [a] -> [a] -> Int
prefixLength' Int
n [] [a]
_ = Int
n
    prefixLength' Int
n [a]
_ [] = Int
n
    prefixLength' Int
n (a
x : [a]
xs) (a
y : [a]
ys)
      | a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = Int -> [a] -> [a] -> Int
forall a. Eq a => Int -> [a] -> [a] -> Int
prefixLength' (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [a]
xs [a]
ys
      | Bool
otherwise = Int
n