@@ -3,6 +3,7 @@
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE LambdaCase #-}
4{-# LANGUAGE LambdaCase #-}
5{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE OverloadedStrings #-}
6+{-# LANGUAGE ScopedTypeVariables #-}
7-- Module : Gen.Types.Id
8-- Module : Gen.Types.Id
8-- Copyright : (c) 2015 Brendan Hay
9-- Copyright : (c) 2015 Brendan Hay
@@ -30,6 +31,8 @@ module Gen.Types.Id
31 , reference
32 , reference
33 -- * Naming
36 -- * Naming
@@ -44,8 +47,12 @@ module Gen.Types.Id
46import Data.Aeson hiding (Bool, String)
49import Data.Aeson hiding (Bool, String)
50+import Data.CaseInsensitive (CI)
47import qualified Data.CaseInsensitive as CI
51import qualified Data.CaseInsensitive as CI
53+import Data.Foldable (foldl')
48import Data.Hashable
54import Data.Hashable
55+import Data.List (elemIndex, sortOn)
49import Data.Semigroup hiding (Sum)
56import Data.Semigroup hiding (Sum)
50import Data.String
57import Data.String
51import Data.Text (Text)
58import Data.Text (Text)
@@ -146,3 +153,27 @@ reference (Global g) (Local l) = Global (g <> Text.split (== '.') l)
147localise :: Global -> Local
154localise :: Global -> Local
148localise = Local . global
155localise = Local . global
157+orderParams :: (a -> Local) -> [a] -> [Local] -> [a]
158+orderParams f xs ys = orderBy f zs (del zs [] ++ global)
160+ zs = orderBy f (sortOn f xs) ys
163+ del [] rs = reverse rs
165+ | f r `elem` global = del qs rs
166+ | otherwise = del qs (f r:rs)
178+orderBy :: Eq b => (a -> b) -> [a] -> [b] -> [a]
179+orderBy g xs ys = sortOn (flip elemIndex ys . g) xs