import Data.List (sortBy)
import Data.Function (on)
permutationBetween' l1@(h1:t) l2 =
case span (/= (False, h1)) l2 of
(prefix, (False, h2):r) ->
length prefix : permutationBetween' t (prefix ++ [(True, h2)] ++ r)
(prefix
, []) -> error "Uh oh" permutationBetween' _ _ = []
permutationBetween :: Eq a1 => [a1] -> [a1] -> [Int]
permutationBetween l1 l2 = permutationBetween' l1
$ map ((,) False
) l2
permute indices list
= map (list
!!) indices
data Color = Red | Blue | Green | Yellow
main = do
let source = [Red, Red, Green, Blue]
let target = [Blue, Red, Green, Red]
let perm = permutationBetween source target
let restore = permute perm
aW1wb3J0IERhdGEuTGlzdCAoc29ydEJ5KQppbXBvcnQgRGF0YS5GdW5jdGlvbiAob24pCgpwZXJtdXRhdGlvbkJldHdlZW4nIGwxQChoMTp0KSBsMiA9CiAgICBjYXNlIHNwYW4gKC89IChGYWxzZSwgaDEpKSBsMiBvZgogICAgICAgICAocHJlZml4LCAoRmFsc2UsIGgyKTpyKSAtPgogICAgICAgICAgICAgbGVuZ3RoIHByZWZpeCA6IHBlcm11dGF0aW9uQmV0d2VlbicgdCAocHJlZml4ICsrIFsoVHJ1ZSwgaDIpXSArKyByKQogICAgICAgICAocHJlZml4LCBbXSkgLT4gZXJyb3IgIlVoIG9oIgpwZXJtdXRhdGlvbkJldHdlZW4nIF8gXyA9IFtdCgpwZXJtdXRhdGlvbkJldHdlZW4gOjogIEVxIGExID0+IFthMV0gLT4gW2ExXSAtPiBbSW50XQpwZXJtdXRhdGlvbkJldHdlZW4gbDEgbDIgPSBwZXJtdXRhdGlvbkJldHdlZW4nIGwxICQgbWFwICgoLCkgRmFsc2UpIGwyCgpwZXJtdXRlIGluZGljZXMgbGlzdCA9IG1hcCAobGlzdCAhISkgaW5kaWNlcwoKZGF0YSBDb2xvciA9IFJlZCB8IEJsdWUgfCBHcmVlbiB8IFllbGxvdwogICAgZGVyaXZpbmcgKEVxLCBTaG93KQoKbWFpbiA9IGRvCiAgICBsZXQgc291cmNlID0gW1JlZCwgUmVkLCBHcmVlbiwgQmx1ZV0KICAgIGxldCB0YXJnZXQgPSBbQmx1ZSwgUmVkLCBHcmVlbiwgUmVkXQogICAgbGV0IHBlcm0gPSBwZXJtdXRhdGlvbkJldHdlZW4gc291cmNlIHRhcmdldAogICAgcHV0U3RyTG4gJCAiU291cmNlOlx0IiArKyBzaG93IHNvdXJjZQogICAgcHV0U3RyTG4gJCAiVGFyZ2V0Olx0IiArKyBzaG93IHRhcmdldAogICAgcHV0U3RyTG4gJCAiUGVybXV0YXRpb246XHQiICsrIHNob3cgcGVybQogICAgbGV0IHJlc3RvcmUgPSBwZXJtdXRlIHBlcm0KICAgIHB1dFN0ckxuICQgIlJlc3RvcmVkIHNvdXJjZTpcdCIgKysgc2hvdyAocmVzdG9yZSB0YXJnZXQp
Source: [Red,Red,Green,Blue]
Target: [Blue,Red,Green,Red]
Permutation: [1,3,2,0]
Restored source: [Red,Red,Green,Blue]